2010-03-05 4 views
0

В моем теннисном приложении моя таблица «match» имеет двух игроков (очевидно). Я использовал player1_id и player2_id для отслеживания идентификаторов пользователей. Однако я не включил внешний ключ user_id.Какие отношения cakephp следует использовать для групп пользователей? Может hasMany использовать массив для foreign_ID?

Существует также таблица «user», в которой я хочу вытащить имена игроков.

Потому что «матч» имеет более одного пользователя, и пользователи имеют более чем одну модель, мне интересно, если следующая конфигурация модель будет работать:

я установки модель пользователя, как это:

var $name = 'User'; 
var $hasMany = array(
'Match' => array(
'className' => 'Match', 
'foreignKey' => array('player1_id', 'player2_id'), 
'dependent' => true, 
) 

и модель матча, как это:

var $name = 'Match'; 
var $belongsTo = array(
'User' => array(
'className' => 'User', 
'foreignKey' => 'user_id', 
'conditions' => '', 
) 

Мне нужно отобразить пользователю имя/фамилия для каждого игрока, где user_id = player1_id или player2_id. Будет ли это работать? Может ли внешний ключ использовать массив? И может ли модельная операция использовать «или» при поиске?

Или есть лучший способ структурировать таблицу (например, совпадение или может быть групповое собрание) с несколькими пользователями?

Приветствия, Пол

ответ

1

Я не думаю, что массив в качестве внешнего ключа на пользователя> отношения Match будет работать, но опять же я никогда не пробовал. Единственное совпадение> Пользовательское отношение с user_id как иностранное не будет работать, поскольку, как вы сказали, этот внешний идентификатор не существует.

Концептуально самым чистым способом было бы правильное отношение hasAndBelongsToMany. В конце концов, в матче есть много игроков, и у игроков много матчей. Таким образом, вы действительно смотрите на отношения «многие ко многим».

Чтобы подделать его с отношением belongsTo/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' 
    ) 
); 

Уродливая часть в модели пользователя, где бы получать сопутствующие матчи разделить на ['MatchAsPlayer1'] и ['MatchAsPlayer2']. Вы можете сделать некоторые обманы в обратном вызове afterFind, чтобы объединить их, но это не очень хорошее решение в целом. Просто пойдите для hasAndBelongsToMany. :)

+0

Спасибо. HASBTM действительно ударил меня по дороге, но не был уверен. Я думал, что можно попробовать, потому что у вас могут быть подобные ситуации, например, таблица с тремя/четырьмя или более игроками. Будет ли каждый пользователь/матч модели HASBTM взять массив, как указано выше, так как в каждом матче есть два игрока? – Paul

+0

@Paul Извините, я не понимаю вопроса. Для вашей справки, однако, обычный аббревиатура - «HABTM». – deceze

+0

Спасибо за помощь. HABTM, отметил. То, что я хотел понять, - это то, что в файле пользователя должны быть указаны как player1_id, так и player2_id? Как будто это выше. Поскольку таблица соответствия содержит два идентификатора игрока, нужно ли на каждом идентификаторе ссылаться в отношении HABTM? Если бы это было по сравнению, скажем, в блоге с тегами и сообщениями HABTM, у каждого был бы только один внешний ключ для другого. Надеюсь, что имеет смысл. Очень признателен. – Paul