Как использовать правило `validCount` для ограничения количества записей текущей модели? - PullRequest
0 голосов
/ 05 апреля 2019

Я пытаюсь использовать правило валидатора validCount для CakePHP 3.x

У меня есть событие с максимальным числом участников (Event-> 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 Ответ

1 голос
/ 06 апреля 2019

Прежде всего, если вам нужно вложить подобные правила, вам придется их оценить.В вашем примере $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;

Это будет запрашивать максимальное количество участников и числоучастников, которые уже существуют, а затем просто сравните эти значения.

...