Как добавить связанные данные при добавлении пользователя одновременно CakePHP 3.x?

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

Уровень членства содержит информацию для этого уровня членства, а запись членства содержит некоторую информацию с уровня членства и связана с пользователем.

Я полагаю, что в форме добавления лежит проблема, но на всякий случай здесь приведены важные фрагменты кода. Я старался сделать это как можно проще.

Функция инициализации таблицы пользователей:

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'
    ]);
}

Функция инициализации таблицы членства:

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>

Я немного изменил код благодаря комментариям и ответам. Уровни членства теперь отображаются в форме, и я выбираю уровень членства при сохранении пользователя, но членство также не сохраняется, только пользователь. Есть еще предложения?

2 ответа

Как насчет того, чтобы начать читать руководство по миграции или заняться обучением по блогам для CakePHP 3? Ваш метод проб и ошибок требует много времени и разочаровывает. Я не могу рекомендовать это достаточно: всегда читайте документацию перед съемкой в ​​темноте. В CakePHP3 многое изменилось. Это включает в себя способ использования точечной нотации. Чтение ассоциаций сохранения может также помочь.

Вы больше не используете префикс модели на первом уровне.

Model.field 

сейчас просто

field

Для вложенных ассоциаций теперь

associated_data.field
associated_data.second_level_data.field

Обратите внимание, что это склоняется и единственного или множественного числа в зависимости от вида ассоциации.

Я обновил свой код, чтобы максимально приблизить все автоматику к работе.

Ключевые моменты: 1.) В контроллере я получил переменную членства уровней, чтобы перейти к представлению, добавив эту строку. (обратите внимание на вызов таблицы пользователей, затем членство, а затем уровень членства).

$membershipLevels = $this->Users->Memberships->MembershipLevels->find('list', ['limit' => 200]);

2.) В представлении я добавил:

<?= $this->Form->input('memberships.membership_levels._id', ['options' => $membershipLevels, 'required' => false]); ?>

Однако это не полный ответ, потому что мне все еще нужно захватить уровень членства в контроллере с помощью запроса, а затем вручную сохранить данные с этого уровня в таблицу членства.

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

Я просмотрел учебник по закладкам, который я делал ранее, поскольку он использует ассоциации, но с этим учебником они могут автоматически добавлять запись bookmarks_tags при добавлении закладки, и я не уверен, что это связано с функциями в таблице файлы или нет.

Другие вопросы по тегам