2010-04-20 11 views
0

Je charge 3 tables différentes en utilisant un cross-join dans Doctrine_RawSql. Cela me ramène l'objet suivant:Doctrine: Comment passer d'une entité à une autre entité 'liée'?

User    -> User class (doctrine base class) 
    Settings  -> DoctrineCollection of Setting 
    User_Settings -> DoctrineCollection of User_Setting 

L'objet ci-dessus est le résultat d'une relation entre many-to-manyUser et SettingUser_Setting agit comme une table de référence . User_Setting contient également un autre champ nommé value. Cela contient évidemment la valeur du Setting correspondant.

Tout bien jusqu'à présent, mais les Settings et User_Settingspropriétés de l'objet retourné User sont en aucune façon liée à l'autre (en dehors du champ setting_id ofcourse).

Existe-t-il un moyen direct de passer directement de la propriété Settings à la propriété User_Settings correspondante?

Ceci est la requête correspondante:

 $sets = new Doctrine_RawSql(); 
     $sets->select('{us.*}, {s.*}, {uset.*}') 
     ->from('(User us CROSS JOIN Setting s) LEFT JOIN User_Setting uset ON us.user_id = uset.user_id AND s.setting_id = uset.setting_id') 
     ->addComponent('us', 'User us') 
     ->addComponent('uset', 'us.User_Setting uset') 
     ->addComponent('s', 'us.Setting s') 
     ->where('s.category_id = ? AND us.user_id = ?',array(1, 1)); 

     $sets = $sets->execute(); 

Edit:

1: c'est le balisage YAML lié

//User relations: 
Setting: 
    class: Setting 
    foreignAlias: User 
    refClass: User_Setting 
    local: user_id 
    foreign: setting_id 

//Setting relations: 
User: 
    class: User 
    foreignAlias: Setting 
    refClass: User_Setting 
    local: setting_id 
    foreign: user_id 

//User_Setting relations: 
Setting: 
    foreignAlias: User_Setting 
    local: setting_id 
    foreign: setting_id 
User: 
    foreignAlias: User_Setting 
    local: user_id 
    foreign: user_id 

2. Voici le code d'objet (qui est généré à partir de YAML):

//BaseUser setup() 
    $this->hasMany('Setting', array(
     'refClass' => 'User_Setting', 
     'local' => 'user_id', 
     'foreign' => 'setting_id')); 
    $this->hasMany('User_Setting', array(
     'local' => 'user_id', 
     'foreign' => 'user_id')); 

//BaseSetting setup() 
    $this->hasMany('User', array(
     'refClass' => 'User_Setting', 
     'local' => 'setting_id', 
     'foreign' => 'user_id')); 
    $this->hasMany('User_Setting', array(
     'local' => 'setting_id', 
     'foreign' => 'setting_id')); 

//BaseUser_Setting setup() 
    $this->hasOne('Setting', array(
     'local' => 'setting_id', 
     'foreign' => 'setting_id')); 
    $this->hasOne('User', array(
     'local' => 'user_id', 
     'foreign' => 'user_id')); 

Répondre

0

En fait, vous devez définir un à plusieurs dans la table de référence, mais en utilisant hasOne():

class User_Setting 
{ 
.... 
    public function setUp() 
    { 
    parent::setUp(); 
    $this->hasOne('User', array(
     'local' => 'user_id', 
     'foreign' => 'id')); 

    $this->hasOne('Setting', array(
     'local' => 'setting_id', 
     'foreign' => 'id')); 
    } 
} 

Ensuite, vous aurez un Doctrine_Record au lieu d'un Doctrine_Collection.

+0

Non, ce n'est pas le cas, j'ai lu l'autre réponse rapide. J'ai ce qui est ci-dessus, s'il vous plaît voir la question mise à jour ... – Ropstah

+0

Les relations dans votre UserSetting ne sont pas correctement définies. Il devrait être "foreign => id" et "local => user_id". – DuoSRX

+0

non J'utilise des noms de colonnes personnalisés. ils ne finissent même pas avec _id, je l'ai juste écrit de cette façon pour plus de commodité. La fin de la mine avec _auto_key. Clés primaires et étrangères. Certaines clés étrangères ont cependant des noms différents plus liés au type de relation auquel elles ressemblent. – Ropstah

0

Vous pouvez définir les relations manquantes en classe User_Setting:

class User_Setting 
{ 
    // ... 
    public function setUp() 
    { 
     $this->hasMany('Users', array(
      'class' => 'User', 
      'local' => 'user_id', 
      'foreign' => 'id', 
     )); 
     $this->hasMany('Settings', array(
      'class' => 'Setting', 
      'local' => 'setting_id', 
      'foreign' => 'id', 
     )); 
    } 
} 
+0

Celles-ci sont toutes deux définies. Mais si je fais ceci: $ sets [0] -> Settings [0] -> User_Setting << renvoie un Doctrine_Collection contenant ALL User_Setting relatif à Setting au lieu du User_Setting correspondant à la fois à Setting AND User. (L'utilisateur est dans $ sets [0] en passant). – Ropstah