Я использую FatFreeFramework 3.4.0
Я использую класс Mapper (SQL)
Я пытаюсь обновить строку непосредственно из POST, но с помощью copyfrom (), а затем обновление не работает, как ожидалось, и save () попытается вставить новую строку.
Вот пример обновления цены книги (использование изменило значение цены с 20 до 43):
Books Table
id (PK)|price
-------------
2 |20<from>
book id: <input type="text" id="id" name="id" value="2" />
price: <input type="text" id="price" name="price" value="43" />
</from><?php
function update_book_price(){
$mapper->copyfrom('POST');
$mapper->update();
}
Это запрос, который производит маппер:
ОБНОВИТЬ book
ЗАДАВАТЬ id
= 2,price
= ’43 ‘ГДЕ id
= 0
И это то, что я ожидаю, что это будет:
ОБНОВИТЬ book
ЗАДАВАТЬ id
= 2,price
= ’43 ‘ГДЕ id
= 2
Я знаю, что могу решить эту проблему с помощью функции load (). Но я не хочу двойной запрос. Я не эксперт по шаблону Data Mapper, поэтому поправьте меня, если я не понимаю, как это должно работать. Как я могу решить это?
По определению, картограф должен быть сопоставляются в запись БД.
В F3:
load()
сопоставить записьdry()
проверить, была ли сопоставлена действительная запись (сухая = не сопоставленная)Итак, в вашем случае:
function update_book_price($f3){
$mapper->load(array('id=?',$f3->get('POST.id')));
if (!$mapper->dry()) {
$mapper->copyfrom('POST');
$mapper->update();
}
}
Целесообразной реализацией всего этого будет сопоставление URL-адреса с записью:
$f3->map('/book/@id','Book');
Тогда в Book
класс, вы бы проверить, если @id
действует до выполнения любого кода контроллера:
class Book {
protected $mapper;
function get($f3) {
//show book
}
function put($f3) {
//update book
$this->mapper->copyfrom('POST');
$this->mapper->save();
}
function beforeRoute($f3,$params) {
$this->mapper=new DB\SQL\Mapper(..);
$this->mapper->load(array('id=?',$params['id']));
if ($this->mapper->dry())
$f3->error(404);//invalid id => book not found
}
}
Других решений пока нет …