我99%肯定这必须是用户错误(因为否则我肯定会有数千名用户发布他们遇到此问题)但我无法弄清楚导致它的原因!
我在模型中有以下代码:
public function setProductPackagingId($id, $product_packaging_id)
{
$this->id = $id;
return $this->saveField('product_packaging_id', $product_packaging_id);
}
public function beforeSave()
{
$this->data[$this->alias]['version'] = 2;
debug($this->data);
return true;
}
public function afterSave($created, $options)
{
debug($options);
}
当我执行函数setProductPackagingId()时,beforeSave触发并调试($ this-> data)返回:
array(
'PurchaseOrderProduct' => array(
'id' => (int) 1,
'product_packaging_id' => (int) 54,
'version' => (int) 1000
)
)
然而,CakePHP生成的SQL只是:
UPDATE `roving_tms`.`purchase_order_products` SET `product_packaging_id` = 54 WHERE `roving_tms`.`purchase_order_products`.`id` = 1
那么,在生成的SQL中以某种方式遗漏了在beforeSave中添加的版本字段?
此外,afterSave中的debug($ options)返回:
array(
'validate' => false,
'fieldList' => array(
(int) 0 => 'product_packaging_id'
),
'callbacks' => true,
'counterCache' => true
)
但是,如果我将setProductPackagingId修改为以下内容:
public function setProductPackagingId($id, $product_packaging_id)
{
$purchase_order_product = array(
'PurchaseOrderProduct' => array(
'id' => $id,
'product_packaging_id' => $product_packaging_id
));
return $this->save($purchase_order_product);
}
调试($这 - >数据);在beforeSave()中产生与以前相同的输出。
但是,产生的SQL是:
UPDATE `roving_tms`.`purchase_order_products` SET `id` = 1, `product_packaging_id` = 54, `version` = 1000 WHERE `roving_tms`.`purchase_order_products`.`id` = 1
(包含版本,这是我想要的)
afterSave()中的debug($ options)产生:
array(
'validate' => true,
'fieldList' => array(),
'callbacks' => true,
'counterCache' => true
)
我在这里看到的唯一区别是,在使用'saveField()'的情况下,afterSave $ options ['fieldlist']包含参数'product_packaging_id'。 但是,从save()调用时,$ options ['fieldlist']为空。
是否有一些非常明显和愚蠢的事情我在这里停止在使用saveField正常工作之前停止?或者这是CakePHP的理想结果? 如果我需要在saveSield中使用beforeSave,我应该直接从beforeSave中执行另一个db更新(这听起来像db I / O原因的愚蠢想法)。或者,我是否需要手动编辑'fieldList'参数,以便实际编辑我想编辑的其他字段?
答案 0 :(得分:2)
CakePHP' saveField()用于保存单个字段。
话虽如此,为什么Cake会生成一个查询并包含一个与你专门告诉它保存的唯一字段无关的字段?
答案是,它没有 - 它构建查询以更新你告诉它的唯一字段。如果您传递了包含数据的20个字段,然后调用saveField()
,它仍然只生成查询以更新您指定的字段,并完全忽略其余数据,无论它是否在初始数据或在beforeSave()
期间添加。
"Used to save a single field value."