首页 文章

如何在添加User同时添加关联数据CakePHP 3.x?

提问于
浏览
1

我希望能够在添加用户的同时添加会员记录 . 我似乎无法让它发挥作用 . 我希望能够选择成员资格级别并将数据发送到我可以添加数据的控制器,除非有办法只选择成员资格级别,它将自动为用户创建成员资格记录添加 .

成员资格级别包含该成员级别的信息,成员资格记录包含来自成员级别的一些信息,并与用户相关联 .

我认为添加形式是问题所在,但以下是代码的重要片段 . 我尽量保持简单 .

用户表初始化功能:

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 回答

  • 3

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

    您不再在第一级使用模型前缀 .

    Model.field
    

    现在只是

    field
    

    对于嵌套关联,它现在是

    associated_data.field
    associated_data.second_level_data.field
    

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

  • 0

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

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

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

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

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

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

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

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

相关问题