Я сам смутился о правильном (или лучшем) способе, чтобы убедиться, что связанные модели отправляются через POST при создании нового пользователя. Оба подхода, приведенные ниже, работают.Как проверить важенную связанную модель в cakephp 3
User hasOne UserDetails
Вариант 1
POST данные:
{
"username": "loremipsum",
"password": "123456",
"UserDetails": {
"first_name": "Lorem",
"last_name": "Ipsum"
}
}
PatchEntity UserDetail и добавить его в User Entity, как это:
public function add() {
$user = $this->Users->newEntity();
if ($this->request->is('post')) {
$user = $this->Users->patchEntity($user, $this->request->data(), [
'associated' => [],
'validate' => true
]);
$userDetail = $this->Users->UserDetails->newEntity($this->request->data());
$user->user_detail = $userDetail;
if ($this->Users->save($user, ['associated' =>['UserDetails']]))
{
...
Edit 1: если UserDetails не является pr esent на $ this-> request-> data(), объект UserDetails получит ошибки проверки.
Вариант 2 Данные
POST:
{
"username": "loremipsum",
"password": "123456",
"user_detail": {
"first_name": "Lorem",
"last_name": "Ipsum"
}
}
Добавить user_detail проверки в UserTable.php:
Edit 2: если я не добавляю проверки user_detail, запрос может быть отправлена без соответствующей модели, и она будет сохранена. Добавив его, убедитесь, что в $ this-> request-> data() есть поле user_detail, и объект пользователей, который получит подтверждение.
$validator
->requirePresence('user_detail', 'create')
->notEmpty('user_detail');
и patchEntity, как это на UsersController.php:
public function add() {
$user = $this->Users->newEntity();
if ($this->request->is('post')) {
$user = $this->Users->patchEntity($user, $this->request->data(), [
'associated' => ['UserDetails'],
'validate' => true
]);
if ($this->Users->save($user, ['associated' =>['UserDetails']]))
{
...
ли эти подходы следующие конвенции торта или есть лучший/чистый способ сделать это?
Вариант 2 - лучший вариант. И это даст вам ошибки проверки как для «Пользователи», так и для соответствующей модели «UserDetails». –
@ObjectManipulator спасибо, что ответили! Фактически в обоих случаях проверка выполняется, потому что проверка выполняется при создании объекта. Основное различие здесь заключается в том, как код написан и отправлены данные :) –