我正在使用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 属性在中是没有办法相互链接的,(当然除了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'));发布于 2010-04-21 12:33:29
实际上,您应该在ref表中定义一对多的关系,但是使用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'));
}
}然后,您将拥有一个Doctrine_Record而不是Doctrine_Collection。
发布于 2010-04-21 09:04:24
您可以在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',
));
}
}https://stackoverflow.com/questions/2678407
复制相似问题