Domanda

Ho una tabella chiamata user_relationship. che ha due chiavi straniere che si riferiscono alla tabella dell'utente per mappare che sono amici.

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 ;

Quando provo a cuocerlo naturalmente non capisce che l'amico_id debba fare riferimento al modulo utente. voglio manuale modificare il codice ma o ho qualche problema a capire quali parti modificare nel seguente

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

In questa parte del codice voglio fare riferimento all'amico_id alla tabella utente

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

Ho provato a farlo .. Devo cambiare qualcos'altro?

    'Friend' => array(
        'className' => 'Friend',
        'foreignKey' => 'user_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    )
È stato utile?

Soluzione

Cosa ne pensi di questo?

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

}

Le associazioni possono essere viste da diversi punti di vista:

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

Il tuo layout "fisico", cioè schema di database, è User -> Relationship -> User. La tua vera relazione desiderata è un User -> User relazione però. Tecnicamente questo si traduce in a User hasAndBelongsToMany User Associazione (chiamata anche molti-to-many). Dal momento che utilizza tre modelli, un'associazione da molti a molti può essere suddivisa in:

  • L'utente ha una relazione/relazione appartenente all'utente
  • Relazione appartenta all'utente/utente hasmany relazione

Non lo fai bisogno L'Associazione Hasandbelongstomany, ma è quello che vuoi effettivamente. Non hai davvero bisogno del modello di relazione, poiché è solo un modello di aiuto per collegare i due utenti, ma se tu fare Vuoi specificare anche le sue associazioni, ha due associazioni di appartenenza.

Altri suggerimenti

Il tuo nome di classe per "amico" è sbagliato. Dal momento che non hai "amici" di "amici" non esiste un modello "amico" e hai il riferimento all'utente di classe "poiché condividono la stessa tabella.

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

Sono stato in grado di cavartela con quanto segue:

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

È disordinato, ma hai l'idea: prendi entrambi i lati della relazione, quindi uniscili dopo un database letto :)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top