Cakephp 4: Как сохранить данные hasone

У меня есть две таблицы базы данных 1) пользователи 2) профили

profiles есть поле с именем bank_ac

Я пытаюсь сохранить его из пользовательской модели.

Я создал ввод формы, например

<?= $this->Form->create($user) ?>
   <?= $this->Form->control('profile.bank_ac'); ?>
<?= $this->Form->end() ?>

Пользовательская модель, которую я добавил ассоциативно, например

$this->hasOne('Profiles');

После отладки получение данных, например

[
    'name' => 'Jone',
    'email' => '[email protected]',
    'profile' => [
        'bank_ac' => '1212212'
    ]
]

объект после исправления отладки

object(App\Model\Entity\User) {

    'name' => 'Jone',
    'email' => '[email protected]',
    '[new]' => true,
    '[accessible]' => [
        'name' => true,
        'email' => true,
        'created' => true,
        'modified' => true
    ],
    '[dirty]' => [
        'name' => true,
        'email' => true,
        'profile' => true
    ],
    '[original]' => [],
    '[virtual]' => [],
    '[hasErrors]' => false,
    '[errors]' => [],
    '[invalid]' => [],
    '[repository]' => 'Users'

}

В UsersController/add я применил код вроде

public function add(){

        $user = $this->Users->newEmptyEntity();

        $user = $this->Users->patchEntity($user, $this->request->getData());

        $this->Users->save($user, ['associated' => ['Profiles']]);

}

Данные профиля не сохраняются, также не возникает никаких ошибок. Как я могу сохранить эти ассоциативные данные?


person Niloy Rony    schedule 18.02.2020    source источник
comment
Для получения дополнительной информации отладьте исправленную сущность $user.   -  person ndm    schedule 18.02.2020
comment
Обновил мой вопрос, спасибо.   -  person Niloy Rony    schedule 18.02.2020


Ответы (1)


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

Добавьте его в свое свойство User::$_accessible, и оно должно работать:

protected $_accessible = [
    // ...
    'profile' => true,
];

Смотрите также

person ndm    schedule 18.02.2020
comment
@NiloyRony Зависит от того, как создается объект (вручную, с использованием пользовательских данных и т. д.) и, как правило, насколько вы можете доверять процессу, который создает объект. Технически, если вы считаете процесс создания объекта безопасным (т. е. пользователи не могут назначать данные, которые вы не хотите, чтобы они могли сохранять в определенном действии), вам не нужно ограничивать процесс сохранения. . - person ndm; 18.02.2020
comment
@NiloyRony Однако ассоциации первого уровня могут быть исправлены и сохранены по умолчанию, поэтому нежелательное проскальзывание данных может легко произойти, если что-то изменится в процессе создания вашей сущности, поэтому вы можете использовать параметр associated как для исправления, так и для сохранения, таким образом даже когда предположительно безопасный объект оказывается ненадежным, сохранение все равно будет ограничено. - person ndm; 18.02.2020