Я запутался в правильном (или лучшем) способе убедиться, что связанные модели отправляются через POST при создании нового пользователя. Оба подхода, перечисленные ниже, работают.
User hasOne UserDetails
Вариант 1
Почтовые данные:
{
"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']]))
{
...
Редактировать 1: если UserDetails отсутствует в $this->request->data(), объект UserDetails получит ошибки проверки.
Вариант 2
Почтовые данные:
{
"username": "loremipsum",
"password": "123456",
"user_detail": {
"first_name": "Lorem",
"last_name": "Ipsum"
}
}
Добавьте проверку user_detail в UserTable.php:
Редактировать 2: если я не добавлю проверку user_detail, запрос можно будет отправить без связанной модели, и он будет сохранен. Его добавление гарантирует, что в $this->request->data() есть поле user_detail, а объект Users получит проверку.
$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']]))
{
...
Соответствуют ли эти подходы соглашениям Cake или есть лучший/чистый способ сделать это?
Users
, так и для связанной моделиUserDetails
. - person Object Manipulator   schedule 07.02.2017