Какие отношения CakePHP следует использовать для групп пользователей? Можно ли использовать массив для Foreign_ID? - PullRequest
0 голосов
/ 06 марта 2010

В моем приложении для тенниса в моем игровом столе есть два игрока (очевидно). Я использовал player1_id и player2_id как способ отслеживания идентификаторов пользователей. Я не включил внешний ключ user_id, хотя.

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

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

Я настроил модель пользователя так:

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 Ответ

1 голос
/ 06 марта 2010

Я не думаю, что массив как внешний ключ в отношениях Пользователь> Соответствие сработает, но опять же я никогда не пробовал.Единственное отношение 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.:)

...