CakePHP保存字段——beforeSave没有效果?(2.4.3)

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

我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);
}
执行函数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."