FatFreeFramework копирование и обновление

Я использую 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, поэтому поправьте меня, если я не понимаю, как это должно работать. Как я могу решить это?

1

Решение

По определению, картограф должен быть сопоставляются в запись БД.

В 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
}

}
2

Другие решения

Других решений пока нет …