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-many
User
et Setting
où User_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_Settings
proprié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'));
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
Les relations dans votre UserSetting ne sont pas correctement définies. Il devrait être "foreign => id" et "local => user_id". – DuoSRX
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