首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >教义:如何从一个实体穿越到另一个“链接”实体?

教义:如何从一个实体穿越到另一个“链接”实体?
EN

Stack Overflow用户
提问于 2010-04-20 20:31:25
回答 2查看 620关注 0票数 0

我正在使用cross-join在Doctrine_RawSql中加载3个不同的表。这使我返回以下对象:

代码语言:javascript
复制
User              -> User class (doctrine base class)
    Settings      -> DoctrineCollection of Setting
    User_Settings -> DoctrineCollection of User_Setting

上面的对象是many-to-many关系UserSetting之间的结果,其中User_Setting充当引用表。User_Setting还包含另一个名为value的字段。这显然包含了相应Setting的值。

但是,到目前为止,返回的Settings对象的User_Settings 属性中是没有办法相互链接的,(当然除了setting_id字段之外)。

是否有任何直接方式直接从Settings User_Settings 属性遍历到相应的属性?

这是相应的查询:

代码语言:javascript
复制
        $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标记

代码语言:javascript
复制
//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生成):

代码语言:javascript
复制
//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'));
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-04-21 12:33:29

实际上,您应该在ref表中定义一对多的关系,但是使用hasOne():

代码语言:javascript
复制
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。

票数 0
EN

Stack Overflow用户

发布于 2010-04-21 09:04:24

您可以在User_Setting类中定义缺失的关系:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2678407

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档