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