CakePHP пусто Поля ассоциаций сохраняются вместо удаления

У меня есть небольшой проект на CakePHP. У него есть таблица с названием article и 5 таблиц полей, таких как категории, теги, изображения и т. Д. Связи в основном являются HasOne, а связанные таблицы имеют несколько столбцов.
При сохранении данных в таблице статей все выглядит хорошо, но в некоторых ассоциациях, например: Article -> Rating, если я не заполнил некоторые поля таблиц Rating, которые сохраняются как null:

+----+------------+--------------+
| id | article_id | rating_value |
+----+------------+--------------+
|  1 |         36 |            3 |
|  2 |         56 |      5454.56 |
|  3 |         57 |            4 |
|  5 |         51 |         NULL |
+----+------------+--------------+

Если я добавлю несколько проверок, я не смогу сохранить статью, так как она должна быть проверена. Все, что я хочу, это то, что если rating_value пусто, то оно не должно создаваться как нулевое (объект отклонен), и статья должна быть сохранена.
Удаление статей работает как положено, все связанные объекты удаляются.

Я пытался изменить $ data на Model.beforeMarshall, но этот класс является закрытым как в статьях статей, так и в рейтингах (я думаю, что ассоциации могут быть проблемой).

Некоторый код (добавление контроллера):

public function add()
{
$article = $this->Articles->newEntity();
if ($this->request->is('post')) {
$article = $this->Articles->patchEntity($article, $this->request->data, [
'associated' => [
'Ratings',
]
]);
if ($this->Articles->save($article)) {
$this->Flash->success(__('Saved.'));
return $this->redirect(['action' => 'index']);
}
}
$this->set('article', $article);
}

Из-за этого я удалил все проверки каждой связанной Модели.

// Articles Table
$this->hasOne('Ratings', [
'className' => 'Ratings',
'dependent' => true,
]);

// Ratings Table
$this->belongsTo('Articles', [
'foreignKey' => 'article_id',
'joinType' => 'INNER'
]);
// Rating.php Entity
protected $_accessible = [
'*' => true,
'id' => false
];
// Article.php Entity
protected $_accessible = [
'*' => true,
];

0

Решение

Если вы устанавливаете rating_value, он попытается сохранить и подтвердить все правила проверки.

Вы можете удалить связанные данные, если rating_value пусто, как это

$dataToSave = $this->request->data;
if(empty($dataToSave['rating']['rating_value'])){
unset($dataToSave['rating']);
}
$article = $this->Articles->patchEntity($article, $dataToSave, [
'associated' => [
'Ratings',
]
]);
0

Другие решения

Я думаю, что все выглядит хорошо. Возможно, ваше поле в таблице имеет значение по умолчанию, равное нулю. Например:

If 'rating_value' field in your table has default value null,
make that default full to none first.

Если проверка не удалась, это не дает вам ничего сохранить вместо сохранения нулевого значения. Если это все еще не работает, вы видите:

debug($this->request->data);

И посмотрите, правильно ли поступают данные с вашей точки зрения (форма).
Еще одним важным моментом является то, что вы можете использовать другой набор проверки для ассоциации. (посмотреть здесь)

0