Cakephp - saveAll 和 beforeSave

Posted

技术标签:

【中文标题】Cakephp - saveAll 和 beforeSave【英文标题】:Cakephp - saveAll and beforeSave 【发布时间】:2013-01-30 15:09:31 【问题描述】:

由于 Cakephp 更新到 2.3.5,我无法保存数据。 我不想保存不包含价格的数据。

我的模型中的 beforeSave 方法如下所示:

public function beforeSave($options = array())
    if(empty($this->data['MyModel']['price']))
        unset($this->data['MyModel']);
     
    return true;

自从我更新后,我在 /lib/Model/Model.php (l. 1751) 中找到了这个

if ($success && $count === 0) 
    $success = false;

如果我评论这 3 行,我的问题就解决了。你知道我的 beforeSave 中不阻止我保存的方法吗?

如果我使用数据验证,我的所有数据都不会用我的 saveAll 保存。

示例模型“选项”验证器:

public $validate = array(
    'prix' => array(
        'rule'       => 'notEmpty'
    )
);

要保存的示例数据:

array(
'Commande' => array(
    'nature_commande' => '0',
    'base_id' => '1',
    'nom' => 'Test',
    'chef_id' => '531',
),
'Option' => array(
    (int) 0 => array(
        'prix' => '5456'
    ),
    (int) 1 => array(
        'prix' => '45645'
    ),
    (int) 3 => array(
        'prix' => ''
    )
)

在我的控制器“Commande”中保存所有内容(返回 false):

debug($this->Commande->saveAll($this->request->data, array('validate' => 'first')));

我希望将我的数据保存在模型“选项”=> 3 的最后一行中。 我可以在我的控制器中使用 foreach 来删除空白行,但我可以做得更好吗?

【问题讨论】:

CakePHP 2.3.5?最新版本是 2.3.0 :-? $count 是字段数。如果您取消设置 $this->data[] 中的所有内容,那么您将没有可以保存蛋糕的字段,因此满足该条件。您的逻辑/代码错误,蛋糕的模型代码很好。使用 cakes 内置验证 【参考方案1】:

您是否考虑过使用CakePHP's built-in data validation?这将允许您指定您不想保存,除非“价格”是某个金额,大于零,介于一个范围......等等等等等等之间。

基本上,您为字段设置规则,并且在您尝试保存一行时,它确保每个字段都通过您设置的任何验证。

它有大量的验证类型,包括有效的电子邮件、号码范围、电话号码、正则表达式等等。

【讨论】:

以上是关于Cakephp - saveAll 和 beforeSave的主要内容,如果未能解决你的问题,请参考以下文章

避免 CakePHP 的 saveAll 并使用手动查询

CakePHP saveAll 方法

CakePHP saveAll 和验证

Cakephp saveAssociated 和 SaveAll Nothing 正常工作

cakephp saveAll 不适用于关联

CakePHP 使用 saveAll:如何使用 HABTM 链接记录保存额外数据?