Если у вас есть таблица 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
Дополнительная информация: