1

我 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”参数,以便实际编辑我想要编辑的其他字段?

4

1 回答 1

2

CakePHP 的saveField()用于保存单个字段。

话虽如此,为什么 Cake 会生成一个查询并包含一个与您明确告诉它保存的唯一字段无关的不同字段?

答案是,它没有 - 它构建查询以更新您告诉它的唯一字段。如果您将 20 个字段与您的数据一起传递,然后调用saveField(),它仍然只会生成查询以更新您指定的字段,而完全忽略其余数据,无论它是在初始数据中还是在beforeSave().

"Used to save a single field value."

http://book.cakephp.org/2.0/en/models/saving-your-data.html#model-savefield-string-fieldname-string-fieldvalue-validate-false

于 2013-12-15T05:15:35.810 回答