CakePHP保存字段——beforeSave没有效果?(2.4.3)
我99%确定这一定是一个用户错误(因为如果不是这样的话,我肯定会有成千上万的用户发帖说他们遇到了这个问题),但我无法找出原因 我在模型中有以下代码:CakePHP保存字段——beforeSave没有效果?(2.4.3),cakephp,cakephp-2.4,Cakephp,Cakephp 2.4,我99%确定这一定是一个用户错误(因为如果不是这样的话,我肯定会有成千上万的用户发帖说他们遇到了这个问题),但我无法找出原因 我在模型中有以下代码: public function setProductPackagingId($id, $product_packaging_id) { $this->id = $id; return $this->saveField('product_packaging_id', $product_packaging_id); } p
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);
}
执行函数setProductPackageId()时,beforeSave激发并调试($this->data)返回:
但是,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
)
但是,如果我将SetProductPackageId修改为以下内容:
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()中的调试($options)生成:
array(
'validate' => true,
'fieldList' => array(),
'callbacks' => true,
'counterCache' => true
)
我在这里看到的唯一区别是,在使用“saveField()”的情况下,afterSave$options['fieldlist']包含参数“product\u packaging\u id”。
但是,从save()调用时,$options['fieldlist']为空
我在这里做的一些非常明显和愚蠢的事情是在saveforesave无法正确使用saveField之前停止的吗?或者这是CakePHP所期望的结果?
如果我需要在saveField中使用beforeSave,我是否应该直接从beforeSave中执行另一个db更新(出于db I/O的原因,这听起来是个愚蠢的想法)。或者,我是否需要手动编辑“fieldList”参数,以便实际编辑我想要编辑的其他字段 CakePHP用于保存单个字段。
也就是说,为什么Cake会生成一个查询并包含一个不同的字段,而这个字段与您明确要求它保存的唯一字段无关
答案是,它没有-它构建查询来更新您告诉它的唯一字段。如果将20个字段与数据一起传递,然后调用saveField()
,它仍然只会生成更新指定字段的查询,并完全忽略其余数据,而不管它是在初始数据中还是在beforeSave()
期间添加的
我知道它用于更新单个字段,但是没有明确说明您不能通过beforeSave操作其他字段。我(错误地)认为它只是对单个字段执行常规save()操作的一种简写。也许这些信息应该在beforeSave()api中提供,因为我希望如果执行beforeSave函数,它应该按照通常的方式执行。不,它就在那里,请阅读方法的全部文档:callbacks设置为false以禁用回调。使用“before”或“after”只能启用这些回调。@burzum你是什么意思?回调正在执行,只是您在回调中编写的代码具有不同的效果,这取决于它是从save()还是从saveField()调用的。Cakephp正在生成一个SQL以尝试更新其他字段。就我而言。即使我尝试更新一个,它也会在一个完全不同的字段上返回一个NOTNULL错误。是时候转向一个好的框架了。@RonaldoSantana-就像任何框架一样,如果你不理解它,并且做错事,你会得到错误的结果。幸运的是,CakePHP有大量免费的在线信息、教程、文档等。
array(
'validate' => true,
'fieldList' => array(),
'callbacks' => true,
'counterCache' => true
"Used to save a single field value."