Question

J'ai une table appelée user_relationship. qui a deux clés étrangères référenceurs à la table utilisateur pour la carte que ce sont des amis.

CREATE TABLE `user_relationships` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `status` varchar(255) default 'pending',
  `time` datetime default NULL,
  `user_id` int(11) unsigned NOT NULL,
  `friend_id` int(11) unsigned NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `fk_user_relationships_users1` (`user_id`),
  KEY `fk_user_relationships_users2` (`friend_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

lorsque je tente de le faire cuire naturellement comprendre ne marche pas que le friend_id doit se référer au module utilisateur. Je veux modifier le code manuel mais o ont une certaine difficulté à comprendre quelles sont les parties à modifier dans ce qui suit

var $belongsTo = array(
    'User' => array(
        'className' => 'User',
        'foreignKey' => 'user_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    ),
    'Friend' => array(
        'className' => 'Friend',
        'foreignKey' => 'friend_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    )
);

Dans cette partie du code que je veux renvoyer l'friend_id à la table de l'utilisateur

    'Friend' => array(
        'className' => 'Friend',
        'foreignKey' => 'friend_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    )

i essayé de faire cela .. dois-je changer quoi que ce soit d'autre?

    'Friend' => array(
        'className' => 'Friend',
        'foreignKey' => 'user_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    )
Était-ce utile?

La solution

Comment cela?

class UserRelationship {

    var $belongsTo = array(
        'User' => array(
            'className' => 'User',
            'foreignKey' => 'user_id'
        ),
        'Friend' => array(
            'className' => 'User',
            'foreignKey' => 'friend_id'
        )
    );

}

class User {

    var $hasAndBelongsToMany = array(
        'Friend' => array(
            'className' => 'User',
            'joinTable' => 'user_relationships',
            'foreignKey' => 'user_id',
            'associationForeignKey' => 'friend_id',
            'with' => 'UserRelationship'
         )
    );

}

Les associations peuvent être vus de différents points de vue:

User        <-    Relationship    ->     User
 |                     |                  |
 hasMany           belongsTo              |
 Relationship  <-  User (user_id)        hasMany
 |                 User (friend_id)  ->  Relationship
 |                                        |
 HABTM                                   HABTM
 User       <---------------------->     User

Votre mise en page « physique », le schéma de base de données à savoir, est User -> Relationship -> User. Votre relation souhaitée est une relation de User -> User bien. Techniquement, cela se traduit par une association de User hasAndBelongsToMany User (aussi appelé many-to-many). Comme il utilise trois modèles, plusieurs-à-plusieurs se décompose en:

  • Relation Utilisateur hasMany / Relation belongsTo utilisateur
  • Relation belongsTo utilisateur / Utilisateur hasMany Relation

Vous ne faites pas besoin l'association hasAndBelongsToMany, mais c'est ce que vous voulez vraiment. Vous ne avez pas vraiment besoin du modèle de relation du tout, car il est juste un modèle d'aide pour relier les deux utilisateurs, mais si vous ne veulent préciser ses associations ainsi, il a deux belongsTo.

Autres conseils

Votre nom de classe « ami » est faux. Puisque vous avez pas de table « amis » il n'y a pas de modèle « ami » et vous avez la référence à la classe « Utilisateur » car ils partagent la même table.

'Friend' => array(
    'className' => 'User',
    'foreignKey' => 'friend_id',
    'conditions' => '',
    'fields' => '',
    'order' => ''
)

J'ai pu sortir avec ce qui suit:

class User extends AppModel {
    var $hasAndBelongsToMany = array(
        'Friends1' => array(
            'className' => 'User',
            'joinTable' => 'friends',
            'foreignKey' => 'user_id',
            'associationForeignKey' => 'friend_id',
            'with' => 'Friend'
         ),
        'Friends2' => array(
            'className' => 'User',
            'joinTable' => 'friends',
            'foreignKey' => 'friend_id',
            'associationForeignKey' => 'user_id',
            'with' => 'Friend'
         )
    );

    function afterFind(array $results) {

        // Merge both sides of the relationship into one alias
        foreach ($results as $key=>$result) {
            if (isset($result["Friends1"]) && isset($result["Friends2"])) {
                $results[$key]["Friends"] = array_merge($result["Friends1"], $result["Friends2"]);
                unset($results[$key]["Friends1"]);
                unset($results[$key]["Friends2"]);
            }
        }

Il est en désordre, mais vous voyez l'idée: saisir les deux côtés de la relation, puis de les fusionner lire après une base de données:)

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