#php #cakephp #cakephp-3.0
#php #cakephp #cakephp-3.0
Вопрос:
Я использую cakephp 3.8 и хочу сохранить свою сущность в таблице сеансов, но модель возвращает мне ошибку, которую я не понимаю, потому что, как вы можете видеть на скриншоте, мое поле «is_active» не пустое, ее значение равно true.
И это мои правила проверки в моей модели :
public function validationDefault(Validator $validator)
{
$validator
->integer('id')
->allowEmpty('id', 'create');
$validator
->scalar('name')
->maxLength('name', 255)
->requirePresence('name', 'create')
->notEmpty('name');
$validator
->boolean('is_active')
->requirePresence('is_active', 'create')
->notEmpty('is_active');
return $validator;
}
И это мой код :
$session = $this->Sessions->newEntity(['session_state_id' => 'OPENED', 'section_id' => $section_id, 'is_active' => true]);
$this->Sessions->patchEntity($session, $this->getRequest()->getData());
$this->Sessions->save($session);
Большое вам спасибо за вашу помощь,
Loic
Комментарии:
1. Можете ли вы показать нам все правила проверки
is_active
, связанные с вашим кодом модели?2. @GregSchmidt Да, я обновил свой пост
3. Откуда мы знаем, что это поле действительно было частью исправленных данных? Как выглядит код, который создает объект? ps, пожалуйста, старайтесь избегать публикации кода в виде изображений — спасибо!
4. @ndm Поскольку я ставлю это непосредственно, когда объявляю свою сущность, я отредактировал свой пост с помощью кода. Как вы можете видеть, мое свойство «is_active» является частью моей сущности
5. Это часть вашей сущности, но не обязательно часть ваших исправленных данных, т. Е., Вероятно, ее нет в
$this->getRequest()->getData()
? Это имело бы смысл, если бы на самом деле было невозможно исправить это из пользовательских данных, но это вызвало бы проблему, которую вы показываете.
Ответ №1:
Вы исправляете дважды выше, ошибка запускается вашим 2-м, «patchEntity ()». Исправьте свой код, я бы сказал, чтобы не исправлять дважды, или включать поле в свои данные, или корректировать правила проверки.
В общем, всегда исправляйте только один раз для каждого типа «создать» против «редактировать». Итак, выше, вы должны делать:
$data = $this->getRequest()->getData();
$data['is_active'] = true; // add fields on top for the same marshalling.
...
$session = $this->Sessions->newEntity($data);
$result = $this->Sessions->save($session);
Альтернатива для действий по созданию (когда требуется объект для построения формы):
$session = $this->Sessions->newEmptyEntity(); // this one doesn't patch.
$ession->is_active = true; // Add fields directly (no validation)
$data = $this->getRequest()->getData();
$data['...'] = ... // If needed for validation
$session = $this->Sessions->patchEntity($session, $data);
$result = $this->Sessions->save($session);
Причина здесь в вашем случае:
Вы устанавливаете правило «при создании» для проверки.
Но независимо от того, как часто вы исправляете, он все равно не сохраняется, поэтому одно и то же правило проверки запускается снова и снова.