我几天前刚开始学习cakePHP,这让我很困惑。如果我从头开始编写项目,我的系统可以说用户和每个用户都有一个配置文件。所以我会创建这样的数据库表:
+----+----------+----------+------------+
| id | username | password | profile_id |
+----+----------+----------+------------+
| 1 | ksno | ksno | 1 |
| 2 | cake | bake | 2 |
+----+----------+----------+------------+
+----+-----------+----------+---------------+
| id | firstname | lastname | birthday |
+----+-----------+----------+---------------+
| 1 | Alex | | in few months |
| 2 | cake | PHP | |
+----+-----------+----------+---------------+
然后我可以从用户创建个人资料实体。问题是,我必须首先创建配置文件,因为表用户具有配置文件的外键。好吧,我会在成功创建所有内容后启动事务并提交。这就是我学习它的方式......
但如果我看一下cakePHP docs and book:
如果表包含外键,则它属于另一个表。
这基本上意味着...用户属于个人资料?但事实并非如此。我几乎完成了对用户及其个人资料的CRUD操作....但我觉得我做错了什么......跟着这本书......我们可以从这样的形式保存一个实体及其关联:
$entity = $users->newEntity($this->request->data(), [
'associated' => [
'Profiles' => ['validate' => false],
]
]);
但它需要更改我的数据库架构,这会导致我误解正在发生的事情,因为我不能在没有配置文件ID的情况下首先保存用户...所以我去做了这个:
$userProfilesRepository = TableRegistry::get('UserProfiles');
$userProfile = $userProfilesRepository->newEntity();
$userProfile = $userProfilesRepository->patchEntity($userInfo, $this->request->data);
$user = $this->Users->patchEntity($user, $this->request->data);
if ($userProfilesRepository->save($userInfo) && $this->Users->save($user->set('profile_id', $userInfo->get('id')))) {...
请有人帮我指出正确的思考数据库方案和框架关联的方法吗?我觉得我做错了,但仅仅因为我在cakePHP中挣扎。
答案 0 :(得分:0)
我认为你有倒退的关系。您不应在profile_id
表中包含users
字段;您应该在user_id
表中有一个profiles
字段。然后,配置文件“属于”用户,这可能对您更有意义。
答案 1 :(得分:0)
您只需要保存用户个人资料并将用户与之关联
$userProfilesRepository = TableRegistry::get('Profiles');
$data = [
'firstname' => 'FOO',
'lastname' => 'BAR',
'user' => [
'username'=>'foo',
'password'=>'bar'
]
]; // Dummy data
$entity = $userProfilesRepository->newEntity($data, [
'associated' => [
'Users' => ['validate' => false],
]
]);
首先创建用户个人资料,然后保存关联。 我希望这会清除它。
答案 2 :(得分:0)
ORM存在问题,无法获得关系模型。然而:设计你的数据库,然后通过ORM“关系”[原文如此] 描述它。 “属于”只是声明的名称。这个名称的选择受到了静止的启发,其中弱ER实体类型(可能是关联的)在其PK中具有FK到其“所属”的另一个“拥有”实体类型的PK。只需使用将FK放在所需位置的声明即可。不要担心拼写。
(您可以将某些记录/模型声明视为描述其对应表的计算列,这些列仅在另一个表的模式中。)
重新设计:对于ER而言,拥有可选配置文件的用户会建议简单的架构,其中配置文件是弱实体,其FK指向他们“属于”的用户。但是您正在考虑在用户中使用 nullable 配置文件FK,这也需要每个配置文件在一个用户中显示为FK的约束。这是一种不必要的复杂设计。简单的设计是将FK放在配置文件表中,这与“配置文件属于用户”一致。