【问题标题】:Manage the relationship between three tables管理三个表之间的关系
【发布时间】:2019-08-26 17:28:05
【问题描述】:

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

谢谢!

【问题讨论】:

    标签: ajax database cakephp-3.0


    【解决方案1】:

    如果您有一个列出所有运动项目的 sports 表和一个供人们使用的 Users 表 - 那么一个额外的 user_sports_and_skills 表将是列出每个用户在每项运动中的技能的好方法。如果它真的只是一个 0-5 的排名,你可能不需要单独的技能表,但如果它存储的不仅仅是一个评级(比如标签“新手”是 0,“专家”是 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

    更多信息:

    【讨论】:

      猜你喜欢
      • 2017-07-18
      • 2012-07-11
      • 2013-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-19
      相关资源
      最近更新 更多