Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
验证嵌套关系-CakePHP 2中是否没有重复项_Php_Validation_Cakephp - Fatal编程技术网

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

验证嵌套关系-CakePHP 2中是否没有重复项,php,validation,cakephp,Php,Validation,Cakephp,我需要确保嵌套关系中没有重复项。例如,假设我有一个可以有许多购买项目的购买。我想确保同一采购项目不能超过1个 post数据如下所示: 我不知道如何验证采购项目的唯一性 “isUnique”规则只检查数据库中是否存在该日志,但不检查同一日志中是否有两个日志 注意我有购买、购买物品和物品型号。我不确定验证应该在哪一个 我尝试过但不起作用的东西: // PurchaseItem model public $validate = array( 'item_id' => array(

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

post数据如下所示:

我不知道如何验证采购项目的唯一性

“isUnique”规则只检查数据库中是否存在该日志,但不检查同一日志中是否有两个日志

注意我有购买、购买物品和物品型号。我不确定验证应该在哪一个

我尝试过但不起作用的东西:

// 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!'
        )
    )
);
Q在这种情况下验证的最佳方法是什么?

您(据我所知)无法使用Cake的验证器验证
有许多类似这样的数据。对保存的每个记录进行验证,而不是对整个数据进行验证。因此,您将无法为您的模型编写自定义验证规则

当Cake save
有许多
数据时,它所做的是为每条记录调用
$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);
}
您也许可以在保存多个
之前为
添加额外的验证规则,并将其添加到新回调中

如果您发现数据包含重复项,您可以使用Cake的验证器将相关字段标记为问题(如果需要):-

$this->Model->invalidate('field_name', 'error message');
要测试数据(我假设您只想测试数据在提交的数据中是唯一的,而不是在数据库中),您可以使用。提取您想要的数据并检查重复数据应该很简单。

您(据我所知)无法使用Cake的验证器验证
中有许多类似的数据。对保存的每个记录进行验证,而不是对整个数据进行验证。因此,您将无法为您的模型编写自定义验证规则

当Cake save
有许多
数据时,它所做的是为每条记录调用
$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);
}
您也许可以在保存多个
之前为
添加额外的验证规则,并将其添加到新回调中

如果您发现数据包含重复项,您可以使用Cake的验证器将相关字段标记为问题(如果需要):-

$this->Model->invalidate('field_name', 'error message');

要测试数据(我假设您只想测试数据在提交的数据中是唯一的,而不是在数据库中),您可以使用。提取所需数据并检查重复数据应该很简单。

谢谢!!我来试一试你的想法,看看它们是如何运作的。你认为你的代码应该放在哪个模型中?嗨@karns,假设你是从
购买
(即
$this->Purchase->saveAssociated($this->request->data);
)中保存,那么你可能想把逻辑放在那个模型中。我刚刚重读了你原来的问题,听起来你想检查一下,没有购买包含特定物品的倍数。在这种情况下,我可能会在我的
purchase
模型中编写一个向采购添加项目的方法,并调用该方法将新项目保存到采购中。然后在该方法中,我将在保存数据之前运行自定义验证。希望这是有道理的。只是为了核实一下。您是否希望能够有一条记录表示多个数量,并将重复的项合并到一条具有适当数量的记录中?由于时间不够,我最终只是在控制器中循环请求数据,检查DUP的哈希值,并设置一条闪存错误消息。我真的不喜欢这个解决方案:/但是,我仍然想找到一个更好的方法。回答你的问题,不-我不想合并重复的数量。我只是想使提交无效。谢谢!!我来试一试你的想法,看看它们是如何运作的。你认为你的代码应该放在哪个模型中?嗨@karns,假设你是从
购买
(即
$this->Purchase->saveAssociated($this->request->data);
)中保存,那么你可能想把逻辑放在那个模型中。我刚刚重读了你原来的问题,听起来你想检查一下,没有购买包含特定物品的倍数。在这种情况下,我可能会在我的
purchase
模型中编写一个向采购添加项目的方法,并调用该方法将新项目保存到采购中。然后在该方法中,我将在保存数据之前运行自定义验证。希望这是有道理的。只是为了核实一下。您是否希望能够有一条记录表示多个数量,并将重复的项合并到一条具有适当数量的记录中?由于时间不够,我最终只是在控制器中循环请求数据,检查DUP的哈希值,并设置一条闪存错误消息。我真的不喜欢这个解决方案:/但是,我仍然想找到一个更好的方法。回答你的问题,不-我不想合并重复的数量。我只是想使提交无效。我知道它很旧,但我在您的请求中没有看到购买id。如果您处于插入模式(create),并且还不知道PurchaseI,则需要添加一个额外的隐藏字段:PurchaseI