管理三个表之间的关系

时间:2019-04-04 20:53:02

标签: ajax database cakephp-3.0

我正在一个项目中列出用户的运动技能。 用户最多可以练习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”创建一个实体并以不同的方式编写我的模型?

谢谢!

1 个答案:

答案 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

  

更多信息: