cross-join
Doctrine_RawSqlを使用して 3 つの異なるテーブルをロードしています。これにより、次のオブジェクトが返されます。
User -> User class (doctrine base class)
Settings -> DoctrineCollection of Setting
User_Settings -> DoctrineCollection of User_Setting
上記のオブジェクトは、 と の関係の結果であり、many-to-many
参照テーブルとして機能します。という名前の別のフィールドも含まれています。これには明らかに、対応する の値が含まれています。User
Setting
User_Setting
User_Setting
value
Setting
これまでのところすべて問題ありませんが、返されたオブジェクトのSettings
とUser_Settings
プロパティは互いにリンクされていません(フィールド ofcourseは別として)。User
setting_id
Settings
プロパティから対応するプロパティに直接トラバースする直接的な方法はありUser_Settings
ますか?
これは対応するクエリです:
$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();
編集:
1: これは関連する YAML マークアップです
//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. これはオブジェクト コードです (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'));