我正在一个项目中列出用户的运动技能。 用户最多可以练习5种运动,每种运动的技能评分为0到5。
我将这3个表链接到另一个名为“ user_sports_and_skills”的第4个表。
所以我有4张桌子: 用户, 体育, 技能, user_sports_and_skills
该想法是在“ user_sports_and_skills”表中为每个新关系都具有一个主键,而在其他3个表中都应具有一个外键。
所以,第一个问题:这是一个好方法吗?
第二个问题: 我想做的是在cakephp 3中正确设置我的模型和控制器,以干净的方式创建一个条目。
我已经阅读了文档,特别是:https://book.cakephp.org/3.0/en/orm/associations.html
所以我尝试了类似的操作,导致我遇到约束错误:
class UsersTable extends Table
{
public function initialize(array $config)
{
$this->belongsToMany('user_sports_and_skills', [
'through' => 'sports', 'skills',
]);
}
}
那么也许我应该为“ user_sports_and_skills”创建一个实体并以不同的方式编写我的模型?
谢谢!
答案 0 :(得分:0)
如果您有一个列出所有运动的sports
表和一个针对人们的Users
表-那么一个额外的user_sports_and_skills
表将是列出每个用户的每个运动的技巧。如果实际上只是排名0-5,则可能不需要单独的“技能表”,但如果存储的不仅仅是评分,它可能会很有用(例如标签“ novice”为0,“ expert”为5,依此类推) )
如果有这三个表,则users_sports_and_skills
表表将只需要用户的ID,运动的ID和技能等级ID,例如:
+-----------+------------+------------+
| user_id | sport_id | skill_id |
+-----------+------------+------------+
| 1 | 1 | 4 |
| 1 | 2 | 3 |
| 2 | 1 | 5 |
| 2 | 1 | 2 |
+-----------+------------+------------+
然后,由于每个用户将有多个user_sports_and_skills
,因此您应该使用hasMany
:
class UsersTable extends Table
{
public function initialize(array $config)
{
$this->hasMany(
'UserSportsAndSkills',
[
'foreignKey' => 'user_id'
]
);
}
}
如果您想从该方向扩展,则Sports表也可以具有相同的关系:
class SportsTable extends Table
{
public function initialize(array $config)
{
$this->hasMany(
'UserSportsAndSkills',
[
'foreignKey' => 'sport_id'
]
);
}
}
user_sports_and_skills表将列出每一行都属于一个用户和一项技能:
class UsersSportsAndSkillsTable extends Table
{
public function initialize(array $config)
{
$this->belongsTo(
'Users',
[
'foreignKey' => 'user_id'
]
);
$this->belongsTo(
'Sports',
[
'foreignKey' => 'sport_id'
]
);
$this->belongsTo(
'Skills',
[
'foreignKey' => 'skill_id'
]
);
}
}
请注意,如果您遵循上述命名约定(user_id是对users表的引用),则Bake实用程序实际上可以为您自动检测这些关系。
可以像“烘焙”每个模型一样简单,例如:
cake bake model users_sports_and_skills
更多信息: