我 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 触发并且 debug($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
那么,我在 beforeSave 中添加的版本字段在生成的 SQL 中以某种方式丢失了?
此外, 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);
}
调试($this->data); 在 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'] 是空白的。
我在这里做的事情是否真的很明显和愚蠢,它会阻止 beforeSave 与 saveField 一起正常工作?或者这是 CakePHP 想要的结果?如果我需要将 beforeSave 与 saveField 一起使用,我是否应该直接从 beforeSave 中执行另一个数据库更新(由于 db I/O 原因,这听起来像是一个愚蠢的想法)。或者,我是否需要手动编辑“fieldList”参数,以便实际编辑我想要编辑的其他字段?