Cakephp SaveAssociated 和 Save - 使用相同的模型验证代码

Posted

技术标签:

【中文标题】Cakephp SaveAssociated 和 Save - 使用相同的模型验证代码【英文标题】:Cakephp SaveAssociated and Save - Using same Model Validation code 【发布时间】:2014-04-27 12:46:47 【问题描述】:

问题:如何在模型验证(尤其是子模型)中对 CakePHP 中的 SaveAssociated 和 Save 函数调用使用相同的代码,...假设 SaveAssociated 实现期望表单数据数组包含属于子模型的数据字段的数字索引 [0]?

场景:

假设我的父模型与多个子模型具有 hasMany 关系。

通常,如果您使用 SaveAssociated 一次将数据保存到所有模型,则需要在视图表单输入中指定索引号(通常为 0)。示例:

echo $this->Form->input('MerchantControl.0.startdate', array('type' => 'text', 'class' => 'datepicker_start'));

因此,任何自定义子模型验证代码也需要使用 [0] 编写。请参阅下面代码示例中的函数 urlParamNotUsedByOtherMerchants。

public $validate = array(
    'urlparam' => array(
        'In Use by other Merchants' => array(
            'rule' => 'urlParamNotUsedByOtherMerchants',
            'message' => 'URLPARAM belongs to another Merchant'
        )
    )
);


public function urlParamNotUsedByOtherMerchants($data) 
    $searchfilter = array(
                        //Because of SaveAssociated, need to refer to index [0] 
                        'MerchantControl.id !=' => $this->data['MerchantControl'][0]['merchant_id'],
                        'MerchantControl.urlparam ' => $data,
                        );        
    $merchantcontrol = $this->find('all', array('conditions' => $searchfilter));
    if (sizeof($merchantcontrol) > 0) 
        return false;
     else 
        return true;
    

问题是在许多其他情况下,我还将在维护视图中使用“Save”而不是“SaveAssociated”,在这些情况下,我只直接更新或创建子模型。在这种情况下,此模型验证代码将失败,并显示索引“[0]”未定义或类似错误。

如何在模型验证(尤其是子模型)中对 Cakephp 中的 SaveAssociated 和 Save 函数调用使用相同的代码?

【问题讨论】:

如果不是偶然,为什么MerchantControl.id 会等于MerchantControl.merchant_id?您不应该与外键列进行比较吗?还有你在用什么validate settingtruefirstmerchant_id 值是从插入获得的,还是从视图传递的值? ps,请务必提及您的确切 CakePHP 版本! 【参考方案1】:

如果我理解正确,您想检查 urlparam 是否已被其他商家使用,或者换句话说,它是否是唯一的。

为什么不使用内置的验证规则isUnique

例子:

public $validate = array(
    'urlparam' => array(
        'In Use by other Merchants' => array(
            'rule' => 'isUnique',
            'message' => 'URLPARAM belongs to another Merchant'
         )
    )
);

【讨论】:

我不能使用 isUnique。单个商家可以多次使用相同的 URLPARAM,这可能作为子模型中的多个记录存在。因此我相信 isUnique 在我的情况下不起作用。我的主要问题仍然是关于为 SaveAssociated 和 Save 使用相同的模型验证代码

以上是关于Cakephp SaveAssociated 和 Save - 使用相同的模型验证代码的主要内容,如果未能解决你的问题,请参考以下文章

cakephp 模型 saveAssociated 错误 - 不能将字符串偏移量用作数组

Cakephp:使用`saveAssociated()`时如何将`parent_id`保存到基于树的模型中?

在 CakePHP 中保存新的关联记录

CakePHP如何在一个saveAll中不知道外键的情况下创建hasMany数据?

Cakephp - saveAll 和 beforeSave

Cakephp 2+ 上传图片时调整图片大小和裁剪