Управление отношениями между тремя таблицами - PullRequest
0 голосов
/ 04 апреля 2019

Я работаю над проектом по перечислению навыков пользователя в спорте. Пользователь может заниматься до 5 видами спорта и иметь рейтинг навыков (от 0 до 5) для каждого.

Я связал эти 3 таблицы с 4-й другой по имени "user_sports_and_skills".

Итак, у меня есть 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 голосов
/ 05 апреля 2019

Если у вас есть таблица sports, в которой перечислены все виды спорта, и таблица Users для людей - тогда одна дополнительная таблица user_sports_and_skills будет хорошим способом для перечисления навыков каждого пользователя в каждом виде спорта.Вам может не понадобиться отдельная таблица для навыков, если на самом деле это просто рейтинг 0-5, но это может быть полезно, если она хранит больше, чем просто рейтинг (например, ярлык «новичок» был 0, «эксперт» был 5 и т. Д..)

Если у вас есть эти три таблицы, то для таблицы users_sports_and_skills потребуется просто идентификатор пользователя, идентификатор вида спорта и идентификатор рейтинга навыка, например:

+-----------+------------+------------+
|  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'
            ]
        );
    }
}

Опционально у Спортивного стола могут быть такие же отношения, если вы когда-либо хотели расширить его в этом направлении:

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 для ссылки натаблица пользователей), утилита Bake может фактически автоматически определить эти отношения для вас.

Может быть так же просто, как «выпекать» каждую из моделей, например:

cake bake model users_sports_and_skills

Дополнительная информация:

...