Fat Free Framework复制和更新

时间:2015-04-22 09:00:49

标签: php datamapper fat-free-framework

我正在使用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 =&#39; 43&#39; WHERE id = 0

这就是我所期望的:

更新book设置id = 2,price =&#39; 43&#39;在哪里id = 2

我知道我可以通过使用load()函数来解决这个问题。但我不想要双重查询。我不是数据映射器模式的专家,所以如果我不明白这应该如何工作,请纠正我。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

根据定义,映射器应映射到DB记录。

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

}