所以我正在开发一个用户可以创建新帐户并上传个人资料照片的系统。我使用了两种型号:create extension "uuid-ossp";
alter table some_table
alter id_column
set default uuid_generate_v4();
用于帐户,User
用于照片。
Photo
表在字段users
上有一个引用photoId
的外键。 photos.id
表有一个photos
字段,其外键引用userId
。因此,User和Photo之间存在递归关系。原因是:创建users.id
时,我们希望能够看到哪Photo
上传了User
。 Photo
有一个User
作为他的个人资料图片。
所以它是Photo
和Photo hasOne User
。它们也以这种方式配置在Table类中。
现在,当保存新的User hasOne Photo
时,我们还想保存新的User
。 Photo
需要新创建的Photo
的ID才能保存,但User
需要新创建的User
的ID。
我的问题:保存这个的最佳方法是什么?我们应该允许Photo
为空,以便我们可以先保存用户,然后保存照片,然后使用正确的User.photoId
更新用户,或者CakePHP3可以做一些魔术这个链接来回为你?
来自表单的数据:
Photo.id
答案 0 :(得分:1)
让事情变得简单!
为什么两个表都需要hasOne关系?
看起来你正在做一件如此简单的事情。让我们谈谈这个:
You have two tables users and photos that's fine.
At the moment each user has one photo that's fine as well.
想象一下,有一天用户可能会有多张照片吗?
Then still no worries, everything would be good because you have photos table already.
那么你真的需要什么样的关系?
Just like mentioned above, user has one photo, That's why relation should be:
user hasOne photo and obviously photo belongsTo user.
你只需要那个。
仅举例来说
用户表上的字段
id
name
email
address
has_photo // eg:if has_photo = 1 user has uploaded photo,such field is not compulsary
password...etc
“照片”表格中的字段
id
user_id // foreign key of users table
name
size
<强>关系强>
// UsersTable.php
$this->hasOne('Photos', [
'foreignKey' => 'user_id'
]);
// PhotosTable.php
$this->belongsTo('Users', [
'foreignKey' => 'user_id',
'joinType' => 'INNER'
]);
不要混淆那张照片需要user_id..users表永远不需要photo_id。因为用户表已经与照片表相关联。如果A hasOne B那么B显然属于A.这就是简单的逻辑。
请不要犹豫,查看文档( Associations )以获取有关关系的更多信息。这对数据库管理来说非常重要。
答案 1 :(得分:0)
或者CakePHP3可以做一些魔术,它可以为你做所有这些连接吗?
是的!只要您的关联设置正确,Cake将负责其余的工作。因此,最好的方法是将数据数组传递到newEntity
或patchEntity
,并确保在您的实体中可以访问所有传递的字段。