Я хотел бы иметь возможность добавлять запись о членстве одновременно с добавлением пользователя. Кажется, я не могу заставить его работать. Я хочу иметь возможность выбирать уровень членства и отправлять эти данные контроллеру, где я могу добавить данные, если только не существует способа просто выбрать уровень членства, и он автоматически создаст запись членства для пользователя, который получает добавлено.Как добавить связанные данные при одновременном добавлении пользователя CakePHP 3.x?
Уровень членства содержит информацию об этом уровне членства, а запись членства содержит некоторую информацию с уровня членства и связана с пользователем.
Форма добавления, на которую я верю, в чем проблема, но на всякий случай вот важные фрагменты кода. Я старался держать его как можно проще.
Пользователи Таблица Initialize Функция:
public function initialize(array $config)
{
parent::initialize($config);
$this->table('users');
$this->displayField('id');
$this->primaryKey('id');
$this->addBehavior('Timestamp');
$this->hasOne('Memberships', [
'foreignKey' => 'user_id',
'joinType' => 'INNER'
]);
}
Членство Таблица Initialize Функция:
public function initialize(array $config)
{
$this->table('memberships');
$this->displayField('id');
$this->primaryKey('id');
$this->addBehavior('Timestamp');
$this->belongsTo('Users', [
'foreignKey' => 'user_id',
'joinType' => 'INNER'
]);
$this->hasOne('MembershipLevels', [
'foreignKey' => 'membership_level_id',
'joinType' => 'INNER'
]);
}
Пользователи Контроллер Добавить Метод:
public function add()
{
$user = $this->Users->newEntity($this->request->data(), [
'associated' => [
'Memberships' => ['associated' => ['MembershipLevels']]
]
]);
if ($this->request->is('post')) {
$user = $this->Users->patchEntity($user, $this->request->data(), [
'associated' => [
'Memberships' => ['associated' => ['MembershipLevels']]
]
]);
if ($$this->Users->save($user)) {
$this->Flash->success(__('You have been added.'));
} else {
$this->Flash->error(__('You could not be added. Please, try again.'));
}
}
$membershipLevels = $this->Users->Memberships->MembershipLevels->find('list', ['limit' => 200]);
$this->set(compact('user', 'membershipLevels'));
$this->set('_serialize', ['user', 'membershipLevels']);
}
Добавить пользователя Форма:
<div class="form">
<h1>Join Now</h1>
<?= $this->Form->create($user); ?>
<fieldset>
<legend><?= __('User Info') ?></legend>
<?= $this->Form->input('full_name', ['required' => false]); ?>
<?= $this->Form->input('username', ['required' => false]); ?>
<?= $this->Form->input('email', ['required' => false]); ?>
<?= $this->Form->input('password', ['required' => false]); ?>
<?= $this->Form->input('password_confirmation', ['type' => 'password', 'required' => false]); ?>
<?php
if ($current_user['role'] === 1 && isset($logged_in)) {
echo $this->Form->input('role', ['type' => 'select', 'options' => ['1' => 'Admin', '2' => 'Editor', '3' => 'Author', '4' => 'Reader'], 'default' => '4']);
}
?>
</fieldset>
<fieldset>
<legend><?= __('Membership Info') ?></legend>
<?= $this->Form->label('Membership Level'); ?>
<?= $this->Form->input('memberships.membership_levels._id', ['options' => $membershipLevels, 'required' => false]); ?>
</fieldset>
<?= $this->Form->button(__('Sign Up'));?>
<?= $this->Form->end();?>
</div>
Я немного изменил код благодаря комментариям и ответам. Уровни членства теперь отображаются в форме, и я выбираю уровень членства при сохранении пользователя, но членство также не сохраняется, просто пользователь. Какие-нибудь дополнительные предложения?
Попробуйте сделать это $ user = $ this-> Пользователи-> patchEntity ($ user, $ this-> request-> data, ['associated' => 'MembershipLevels']); Просьба также отлаживать ($ user); и обновлять данные отладки. – justrohu
@justrohu. Часть вопроса состоит в том, что MembershipLevels ассоциируется с Членством, а членство связано с Пользователями. Мне нужно иметь возможность выбрать идентификатор MembershipLevel в форме и затем сохранить эти данные в записи членства, которая связана с добавленным пользователем. Поэтому MembershipLevels напрямую не связаны с пользователем. – Battousai
@justrohu Я обновил свой код, чтобы отразить ваш комментарий. – Battousai