为了简单起见,我简化了我的表,以使我的核心需求得到满足。
我有两张桌子:管理员和用户。管理表简单保存与问题不完全相关的某些信息。
管理员:
+----+---------+
| id | user_id |
+----+---------+
| 1 | 20 |
+----+---------+
| 2 | 25 |
+----+---------+
| 3 | 27 |
+----+---------+用户:
+----+--------+-----------+
| id | name | surname |
+----+--------+-----------+
| 20 | Name 1 | Surname 1 |
+----+--------+-----------+
| 25 | Name 2 | Surname 2 |
+----+--------+-----------+
| 27 | Name 3 | Surname 3 |
+----+--------+-----------+这样做的想法是,当超级管理员保存一个新用户时,填写一个表单,作为各种类型的用户注册,并在保存时保存用户并使用新创建的用户id创建管理记录。
显然,如果用户帐户不存在,则无法创建管理记录,因为它需要用户id。蛋糕简单返回一个错误,说"user_id是必需的“。
这是我的表格:
<?= $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() ?>我尝试创建一个具有管理关联的用户,而另一个方法则是:
$admin = $this->Admins->newEntity();
if($this->request->is('post')) {
$this->Admins->patchEntity($admin, $this->request->data,[
'associated' => ['Users']
]);
$savedAdmin = $this->Admins->save($admin);
}和
$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);
}我不保存单独的实体,因为我知道保存关联数据是可能的,我只是不知道如何保存管理记录,因为它依赖于用户记录。
发布于 2015-08-24 06:04:15
首先,创建您的管理实体,然后关联用户(因为admin需要用户id)。完成之后,创建新的用户实体并将其赋值给一个变量。
手工分配新创建的用户的外键,Cake将根据您的模型确定需要为其分配主键。最后,保存您的管理,它将自动保存您的相关实体。
这就是为什么在前面的回答中提到的定义您的所属和在相关模型中有一个是很重要的。
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);
}发布于 2015-08-21 15:08:01
听起来,在user表中有一个布尔字段来定义用户是否是管理员可能更有意义。
尽管如此,如果模型还不存在,您可能需要定义模型中的关系。从技术上讲,基于您的表名和列(user_id) Cake应该为您烘焙,但我不记得是否传统上使用复数模型名称(用户、管理员),因此这种情况可能没有发生。
用户:
public $belongsTo = [
'Admins' => [
'classname' => 'Admins', //are your models really plural?
'foreignKey' => 'user_id',
];管理员
public $hasOne= [
'Users' => [
'classname' => 'Users',
'foreignKey' => 'user_id',
];然后,我认为您需要指定一些有关管理的信息,否则您将没有任何数据来保存关联。认为:
echo $this->Form->input('admins.field1');
echo $this->Form->input('admins.field2');
echo $this->Form->input('admins.field3');注意,如果不想输入任何内容,这些字段可以隐藏。
要保存,请从请求数据中创建一个新用户(您的表单创建了一个用户,但是您可以使用该表单创建一个管理程序,然后添加user.name和user.surname之类的输入)。主计长:
$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);
}https://stackoverflow.com/questions/32134092
复制相似问题