Php 关于无脂肪框架查询
我对无脂肪框架中的更新查询有这种奇怪的感觉Php 关于无脂肪框架查询,php,mysql,fat-free-framework,Php,Mysql,Fat Free Framework,我对无脂肪框架中的更新查询有这种奇怪的感觉 public function updateTransactionSalesFlush() { $this->load(array('active=1 AND void=0')); if (!$this->dry()) { $data = array('salestemp' => 0); $this->copyFrom($data); $t
public function updateTransactionSalesFlush() {
$this->load(array('active=1 AND void=0'));
if (!$this->dry()) {
$data = array('salestemp' => 0);
$this->copyFrom($data);
$this->update();
}
}
此函数仅更新所选的第一条记录,但不按预期更新所有记录。我是做错了什么还是这是一个错误
使用exec函数可以很好地执行以下查询:
UPDATE transactions SET salestemp=0 WHERE active= 1 AND void= 0
默认情况下,数据映射程序的load()
方法仅检索与指定条件匹配的第一条记录。如果有多条记录满足与加载的第一条记录相同的条件,则可以使用skip()
方法进行导航:
load()
方法加载与指定条件匹配的所有记录,但一次只映射一条记录
然后,您需要使用next()
或skip()
方法浏览记录集
您的代码只更新第一条记录,因为它缺少循环。以下是修复方法:
public function updateTransactionSalesFlush() {
$this->load(array('active=1 AND void=0'));
while (!$this->dry()) {
$this->salestemp=0;
$this->update();
$this->next();
}
}
或者,您可以调用find()
方法,而不是load()
:
当然,如果要更新大量记录,最好通过exec()
方法执行单个UPDATE
语句:
public function updateTransactionSalesFlush() {
$this->db->exec('UPDATE '.$this->table.' SET salestemp=0 WHERE active=1 AND void=0');
}
thx,现在已经很清楚了,但是使用skip()metod迭代所有记录来更新它似乎非常无用。是否使用exec()方法要好得多??这可能是一个改进的好主意。
update
方法可以选择接受一个过滤器,就像remove
方法一样。然后它需要两个参数:过滤器和键/值对。我最初想使用对象的属性作为键/值对,但这不一定是直观的,而且它对像key1=key2+1
这样的表达式不起作用。因此,尽管我讨厌香草SQL的想法,但我必须承认,使用数据映射器进行操作太棘手了。
public function updateTransactionSalesFlush() {
$this->db->exec('UPDATE '.$this->table.' SET salestemp=0 WHERE active=1 AND void=0');
}