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