FatFreeFramework 复制和更新

FatFreeFramework copyfrom and update

我正在使用 FatFreeFramework 3.4.0

我正在使用 Mapper class (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() 函数解决这个问题。但我不想要双重查询。我不是数据映射器模式方面的专家,所以如果我不明白这应该如何工作,请纠正我。我该如何解决这个问题?

根据定义,映射器应该映射到数据库记录。

在 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 class 中,您将在执行任何控制器代码之前检查 @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
  }

}