验证嵌套关系中没有重复 - CakePHP 2

时间:2015-06-23 15:20:42

标签: php validation cakephp

我需要确保嵌套关系中没有重复项。例如,假设我有一个购买可以有很多购买项目。我想确保购买商品的数量不能超过1个。

帖子数据如下所示:

enter image description here

我无法弄清楚如何验证购买商品是否独一无二。

“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!'
        )
    )
);

在这种情况下验证的最佳方式是什么?

1 个答案:

答案 0 :(得分:0)

你不会(据我所知)能够使用Cake的验证器验证hasMany这样的数据。要求保存每个单独记录的验证,而不是整个所有数据。因此,您无法为模型编写自定义验证规则。

当Cake保存hasMany数据时,它为每条记录调用$this->Model->save();这是调用与beforeSavebeforeValidate回调一起调用的地方。他们只能看到保存个别记录的数据。

相反,您需要在保存之前采用更加手动的方法进行验证。您可以通过为您的模型扩展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。提取所需数据并检查重复数据应该很简单。