Frage

Ich habe eine Tabelle namens user_relationship. Dies hat zwei Fremdschlüsse, die sich auf die Benutzertabelle beziehen, um die Freunde zuzubereiten.

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 ;

Wenn ich versuche, es zu backen, versteht es natürlich nicht, dass sich das Freund_id auf das Benutzermodul beziehen muss. Ich möchte den Code manuell bearbeiten, aber ich habe ein Problem damit, zu verstehen, welche Teile im Folgenden zu bearbeiten sind

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

In diesem Teil des Codes möchte ich den Freund_ID an die Benutzertabelle verweisen

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

Ich habe versucht, dies zu tun. Muss ich noch etwas ändern?

    'Friend' => array(
        'className' => 'Friend',
        'foreignKey' => 'user_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    )
War es hilfreich?

Lösung

Wie wäre es damit?

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

}

Assoziationen sind aus verschiedenen Gesichtspunkten zu sehen:

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

Ihr "physisches" Layout, dh Datenbankschema, ist User -> Relationship -> User. Ihre wirklich gewünschte Beziehung ist eine User -> User Beziehung allerdings. Technisch bedeutet das in a User hasAndBelongsToMany User Assoziation (auch viele zu viele genannt). Da es drei Modelle verwendet, kann ein vielen zu viele Assoziationen unterteilt werden in:

  • Benutzer Hasmany -Beziehung/Beziehung hingehörniger Benutzer
  • Beziehung hör

Du nicht brauchen Die Hasandbelongstomany Association, aber es ist das, was Sie eigentlich wollen. Sie brauchen das Beziehungsmodell überhaupt nicht wirklich, da es sich nur um ein Helfermodell handelt, um die beiden Benutzer zu verbinden, aber wenn Sie tun Sie möchten auch seine Assoziationen angeben, es hat zwei Hingasto -Assoziationen.

Andere Tipps

Ihr Klassenname für "Freund" ist falsch. Da Sie keine Tabelle "Freunde" haben, gibt es keinen Modell "Freund" und Sie haben die "Benutzer" auf die Klasse "Benutzer", da sie dieselbe Tabelle teilen.

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

Ich konnte mit Folgendem davonkommen:

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"]);
            }
        }

Es ist chaotisch, aber Sie haben die Idee: Schnappen Sie sich beide Seiten der Beziehung und fusionieren Sie sie dann nach einer Datenbank gelesen :)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top