首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在添加用户的同时添加关联数据? CakePHP 3.x?

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

Stack Overflow用户
提问于 2015-12-01 08:46:30
回答 2查看 604关注 0票数 1

我希望能够在添加用户的同时添加成员记录。我好像不能让它工作。我希望能够选择成员资格级别,并将数据发送到控制器,在那里我可以添加数据,除非有一种方法只选择成员资格级别,并且它会自动为添加的用户创建成员资格记录。

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

我认为add表单就是问题所在,但为了以防万一,这里有一些重要的代码片段。我试着让它尽可能简单。

Users Table Initialize函数:

代码语言:javascript
复制
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'
    ]);
}

成员资格表初始化函数:

代码语言:javascript
复制
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'
    ]);
}

用户控制器添加方法:

代码语言:javascript
复制
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']);
}

添加用户表单:

代码语言:javascript
复制
<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>

多亏了评论和答案,我对代码做了一些修改。成员资格级别现在显示在表单中,我在保存用户时选择了成员资格级别,但成员资格不会同时保存,只有用户会保存。有什么进一步的建议吗?

EN

回答 2

Stack Overflow用户

发布于 2015-12-01 16:14:41

开始阅读migration guide,或者为CakePHP3做博客教程怎么样?您的试验和错误方法既耗时又令人沮丧。我再怎么推荐也不为过:在黑暗中拍摄之前,一定要先阅读文档。在CakePHP3中有很多变化。这包括使用点符号的方式。阅读saving associations可能也会有所帮助。

您不再使用第一级上的model前缀。

代码语言:javascript
复制
Model.field 

现在就是

代码语言:javascript
复制
field

对于嵌套关联,现在是

代码语言:javascript
复制
associated_data.field
associated_data.second_level_data.field

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

票数 3
EN

Stack Overflow用户

发布于 2015-12-03 11:49:27

我已经更新了我的代码,以使我可以让所有的自动化工作。

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

代码语言:javascript
复制
$membershipLevels = $this->Users->Memberships->MembershipLevels->find('list', ['limit' => 200]);

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

代码语言:javascript
复制
<?= $this->Form->input('memberships.membership_levels._id', ['options' => $membershipLevels, 'required' => false]); ?>

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

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

我已经看过我之前做过的书签教程,因为它使用了关联,但是有了那个教程,当你添加书签时,他们能够自动添加bookmarks_tags记录,我不确定这是不是由于表文件中的函数所致。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34010738

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档