同时添加用户CakePHP 3.x时如何添加关联数据?

时间:2015-12-01 00:46:30

标签: cakephp cakephp-3.0 cakephp-3.1 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 个答案:

答案 0 :(得分:3)

如何开始阅读migration guide,或者为CakePHP 3 做博客教程?您的试错法非常耗时且令人沮丧。我不能推荐这个:总是在在黑暗中拍摄之前阅读文档。 CakePHP3有很多变化。这包括使用点符号的方式。阅读saving associations也可能有所帮助。

您不再使用第一级的模型前缀。

Model.field 

现在只是

field

对于嵌套关联,它现在是

associated_data.field
associated_data.second_level_data.field

请注意,根据关联的类型,这是变形的,单数或复数。

答案 1 :(得分:0)

我已经更新了我的代码以获得最接近我可以使所有自动化工作。

要点: 1.)在控制器中,我获得了成员资格级别变量,通过添加此行传递给视图。 (注意调用users表然后调用成员资格然后调用成员资格)。

<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-core</artifactId>
  <version>5.0.3.Final</version>
  <scope>compile</scope>
  <optional>true</optional>
</dependency>

2。)在视图中我添加了:

<hibernate-framework.version>5.0.3.Final</hibernate-framework.version>

但这不是一个完整的答案,因为我仍然需要通过查询获取控制器中的成员资格级别,然后手动将该级别的数据保存到成员资格表中。

我至少可以动态填充表单中的成员资格级别输入并提交。

我查看了以前我使用过的书签器教程,因为它使用了关联,但是通过该教程,他们可以在添加书签时自动添加bookmarks_tags记录,我不确定是否是由于这些功能在表文件中与否。