首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CakePHP 3-使用依赖关联的关联保存数据

CakePHP 3-使用依赖关联的关联保存数据
EN

Stack Overflow用户
提问于 2015-08-21 06:51:08
回答 2查看 1.1K关注 0票数 1

为了简单起见,我简化了我的表,以使我的核心需求得到满足。

我有两张桌子:管理员和用户。管理表简单保存与问题不完全相关的某些信息。

管理员:

代码语言:javascript
复制
+----+---------+
| id | user_id |
+----+---------+
| 1  | 20      |
+----+---------+
| 2  | 25      |
+----+---------+
| 3  | 27      |
+----+---------+

用户:

代码语言:javascript
复制
+----+--------+-----------+
| id | name   | surname   |
+----+--------+-----------+
| 20 | Name 1 | Surname 1 |
+----+--------+-----------+
| 25 | Name 2 | Surname 2 |
+----+--------+-----------+
| 27 | Name 3 | Surname 3 |
+----+--------+-----------+

这样做的想法是,当超级管理员保存一个新用户时,填写一个表单,作为各种类型的用户注册,并在保存时保存用户并使用新创建的用户id创建管理记录。

显然,如果用户帐户不存在,则无法创建管理记录,因为它需要用户id。蛋糕简单返回一个错误,说"user_id是必需的“。

这是我的表格:

代码语言:javascript
复制
<?= $this->Form->create($user) ?>
<fieldset>
    <legend><?= __('Add Admin') ?></legend>
    <?php
        echo $this->Form->input('user.name');
        echo $this->Form->input('user.surname');
    ?>
</fieldset>
<?= $this->Form->button(__('Submit')) ?>
<?= $this->Form->end() ?>

我尝试创建一个具有管理关联的用户,而另一个方法则是:

代码语言:javascript
复制
    $admin = $this->Admins->newEntity();

    if($this->request->is('post')) {
        $this->Admins->patchEntity($admin, $this->request->data,[
            'associated' => ['Users']
        ]);
        $savedAdmin = $this->Admins->save($admin);
    }

代码语言:javascript
复制
    $user = $this->Admins->Users->newEntity();

    if($this->request->is('post')) {
        $this->Admins->Users->patchEntity($user, $this->request->data,[
            'associated' => ['Admins']
        ]);
        $savedUser = $this->Admins->Users->save($user);
    }

我不保存单独的实体,因为我知道保存关联数据是可能的,我只是不知道如何保存管理记录,因为它依赖于用户记录。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-24 06:04:15

首先,创建您的管理实体,然后关联用户(因为admin需要用户id)。完成之后,创建新的用户实体并将其赋值给一个变量。

手工分配新创建的用户的外键,Cake将根据您的模型确定需要为其分配主键。最后,保存您的管理,它将自动保存您的相关实体。

这就是为什么在前面的回答中提到的定义您的所属和在相关模型中有一个是很重要的。

代码语言:javascript
复制
if ($this->request->is('post')) {
    $admin = $this->Admins->newEntity($this->request->data, [
        'associated' => ['Users']
    ]);

    $user = $this->Admins->Users->newEntity();
    $admin->user_id = [$user];

    $saved = $this->Admins->save($admin);
}
票数 0
EN

Stack Overflow用户

发布于 2015-08-21 15:08:01

听起来,在user表中有一个布尔字段来定义用户是否是管理员可能更有意义。

尽管如此,如果模型还不存在,您可能需要定义模型中的关系。从技术上讲,基于您的表名和列(user_id) Cake应该为您烘焙,但我不记得是否传统上使用复数模型名称(用户、管理员),因此这种情况可能没有发生。

用户:

代码语言:javascript
复制
public $belongsTo = [
    'Admins' => [
        'classname' => 'Admins', //are your models really plural? 
        'foreignKey' => 'user_id',
];

管理员

代码语言:javascript
复制
public $hasOne= [
    'Users' => [
        'classname' => 'Users',
        'foreignKey' => 'user_id',
];

然后,我认为您需要指定一些有关管理的信息,否则您将没有任何数据来保存关联。认为:

代码语言:javascript
复制
echo $this->Form->input('admins.field1');
echo $this->Form->input('admins.field2');
echo $this->Form->input('admins.field3');

注意,如果不想输入任何内容,这些字段可以隐藏。

要保存,请从请求数据中创建一个新用户(您的表单创建了一个用户,但是您可以使用该表单创建一个管理程序,然后添加user.name和user.surname之类的输入)。主计长:

代码语言:javascript
复制
$user = $this->Admins->Users->newEntity();

if($this->request->is('post')) {
    $this->Admins->Users->patchEntity($user, $this->request->data, [
        'associated' => ['Admins']
    ]);
    $this->Admins->Users->save($user);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32134092

复制
相关文章

相似问题

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