cette relation CakePHP doit être utilisé pour des groupes d'utilisateurs? peut haveMany utiliser le tableau pour foreign_ID?

StackOverflow https://stackoverflow.com/questions/2390737

Question

Dans ma demande de tennis, ma table 'match' a deux joueurs (évidemment). Je l'ai utilisé player1_id et player2_id comme un moyen de suivre l'utilisateur ids. Je n'ai pas inclus une clé étrangère user_id bien.

Il y a aussi une table « utilisateur » où je veux tirer les noms des joueurs de.

Parce que « match » a plus d'un utilisateur et les utilisateurs ont plus d'un modèle, je me demande si la configuration du modèle suivant fonctionnera:

J'ai installé le modèle utilisateur comme ceci:

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

et le modèle de match comme ceci:

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

Je dois montrer à l'utilisateur premier / dernier nom pour chaque joueur où user_id = player1_id ou player2_id. Est-ce que ça va marcher? une clé étrangère peut utiliser un tableau? Et peut-elle utiliser le fonctionnement du modèle d'un « ou » lors de la recherche?

Ou est-il une meilleure façon de structurer une table (comme un match, ou pourrait être une réunion de groupe) avec plus d'un utilisateur?

Cordialement, Paul

Était-ce utile?

La solution

Je ne pense pas un tableau comme une clé étrangère sur l'utilisateur> relation de match fonctionnerait, mais là encore je ne l'ai jamais essayé. Le seul match> relation utilisateur avec user_id comme étranger ne fonctionnera pas si, puisque, comme vous l'avez dit, que id étranger n'existe pas.

Conceptuellement la façon la plus propre serait une bonne relation de hasAndBelongsToMany. Après tout, un match a beaucoup de joueurs, et les joueurs ont beaucoup de matches. Donc, vous cherchez vraiment à plusieurs à plusieurs.

Pour simuler avec une relation belongsTo / hasMany, vous devez faire ceci:

// 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'
    )
);

La partie est laide dans le modèle de l'utilisateur, où vous recevriez matchs connexes divisés en ['MatchAsPlayer1'] et ['MatchAsPlayer2']. Vous pouvez faire une supercherie dans le rappel de afterFind pour fusionner ceux-ci, mais ce n'est pas une solution agréable dans l'ensemble. Il suffit d'aller pour le hasAndBelongsToMany. :)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top