【发布时间】: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?您不应该与外键列进行比较吗?还有你在用什么validatesetting,true或first?merchant_id值是从插入获得的,还是从视图传递的值? ps,请务必提及您的确切 CakePHP 版本!