Я не думаю, что массив как внешний ключ в отношениях Пользователь> Соответствие сработает, но опять же я никогда не пробовал.Единственное отношение Match> User с user_id
в качестве иностранного не будет работать, поскольку, как вы сказали, этот внешний идентификатор не существует.
Концептуально самым чистым способом было бы правильное отношение hasAndBelongsToMany.В конце концов, в матче много игроков, а у игроков много матчей.Таким образом, вы действительно смотрите на отношения «многие ко многим».
Чтобы подделать его с помощью отношения ownTo / hasMany, вам необходимо сделать следующее:
// user model
var $hasMany = array(
'MatchAsPlayer1' => array(
'className' => 'Match',
'foreignKey' => 'player1_id',
),
'MatchAsPlayer2' => array(
'className' => 'Match',
'foreignKey' => 'player2_id',
)
);
// match model
var $belongsTo = array(
'Player1' => array(
'className' => 'User',
'foreignKey' => 'player1_id'
),
'Player2' => array(
'className' => 'User',
'foreignKey' => 'player2_id'
)
);
Уродливая частьнаходится в модели User, где вы получите соответствующие совпадения, разделенные на ['MatchAsPlayer1']
и ['MatchAsPlayer2']
.Вы можете сделать некоторую хитрость в обратном вызове afterFind
, чтобы объединить их, но в целом это не очень хорошее решение.Просто зайдите на hasAndBelongsToMany.:)