如何使用有效计数规则来限制当前模型的记录数量?

时间:2019-04-05 16:49:12

标签: validation cakephp associations cakephp-3.x

我正在尝试使用cakephp 3.x的validCount验证器规则

我有一个活动,参加人数最大参与者(事件-> max_pax)

我想添加一个验证规则,当参与者的编号为max_pax + 1时会拒绝该参与者。

我做错了,但是我不明白(我的代码如下)

//This is in Participant Model.php
public function buildRules(RulesChecker $rules)
{
      $rules->add(
            function ($entity, $options) use ($rules) {
                $query = $this->Events->find();
                $max_pax = $query->select('max_pax')
                    ->where(['id'=>$entity->event_id])
                    ->first();                      
                $r =  $rules->validCount('events', $max_pax , '<=', "maximum $max_pax participants");
                debug($r);  
                return $r;
            },
            'maxPax',
            [
                'errorField' => 'event_id',
                'message' => "Choose another event"
            ]
        );

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

首先,如果您在哪里嵌套这样的规则,则必须对其进行评估。在您的示例中,$r\Cake\Datasource\RuleInvoker类型的可调用对象,因此您将执行以下操作:

$result = $r($entity, $options);

然后进一步评估验证结果(这是一个布尔值),或者从您的自定义规则返回。同样在您的示例中,$max_pax将是一个实体,您必须实际访问它上的字段并将其传递给validCount()方法。

但是,validCount()被用于对给定实体上当前存在的关联数据进行计数,它不执行任何数据库查找,即,用于保存记录的情况(包括关联记录),并希望为可以/必须保存的关联记录的数量定义限制。因此,例如,如果您要在其中创建包括参与者的新事件,可以使用它,以确保您尝试插入的参与者不超过允许的数量。

通过参与者模型创建记录时,您实际上想查询数据库以计算已经与选定事件关联的参与者数。没有内置的规则可以执行此操作,因此您必须自己执行此操作,例如,执行以下操作:

$event = $this->Events
    ->find()
    ->select(\Cake\ORM\Query $query) {
        return [
            'Events.max_pax',
            'number_of_participants' => $query->func()->count('Participants.id')
        ];
    })
    ->leftJoinWith('Participants')
    ->where(['Events.id' => $entity->event_id])
    ->first();

return $event->get('number_of_participants') < $event->max_pax;

这将查询允许的最大参与者人数和已经存在的参与者人数,然后简单地比较这些值。