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
}
}
我正在使用 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
}
}