我需要确保嵌套关系中没有重复项。例如,假设我有一个购买可以有很多购买项目。我想确保购买商品的数量不能超过1个。
帖子数据如下所示:
我无法弄清楚如何验证购买商品是否独一无二。
“isUnique”规则仅检查它是否已存在于数据库中,但不检查同一帖子中是否有两个。
注意我有Purchase,PurchaseItem和Item模型。我不确定验证应该在哪一个......
我试过的东西,但不起作用:
// PurchaseItem model
public $validate = array(
'item_id' => array(
'unique' => array(
'rule' => array('isUnique', array('purchase_id', 'item_id'), false),
'message' => 'You may only use the same item once!'
)
)
);
问 在这种情况下验证的最佳方式是什么?
答案 0 :(得分:0)
你不会(据我所知)能够使用Cake的验证器验证hasMany
这样的数据。要求保存每个单独记录的验证,而不是整个所有数据。因此,您无法为模型编写自定义验证规则。
当Cake保存hasMany
数据时,它为每条记录调用$this->Model->save()
;这是调用与beforeSave
和beforeValidate
回调一起调用的地方。他们只能看到保存个别记录的数据。
相反,您需要在保存之前采用更加手动的方法进行验证。您可以通过为您的模型扩展saveMany()
来执行此操作: -
public function saveMany($data = null, $options = array()) {
// 1. Do some additional cross record validation here
// (return false if duplicates found)
// 2. Continue to save
return parent::saveMany($data, $options);
}
beforeSaveMany
可能会add a new callback,并在新的回调中添加额外的验证规则。
如果您发现数据包含重复数据,您可以使用Cake的验证程序将相关字段标记为您想要的问题: -
$this->Model->invalidate('field_name', 'error message');
要测试数据(我假设您只想测试在提交的数据中是唯一的而不是在数据库中),您可以使用Cake's Hash utility。提取所需数据并检查重复数据应该很简单。