代码之家  ›  专栏  ›  技术社区  ›  Ropstah

条令:如何从一个实体过渡到另一个“关联”实体?

  •  0
  • Ropstah  · 技术社区  · 16 年前

    我用一个 cross-join 在罗夫斯基学说中。这使我想起了以下对象:

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

    上面的对象是 many-to-many 之间的关系 User Setting 哪里 User_Setting 作为一个角色 参考表 . 用户设置 还包含另一个名为 value . 这显然包含了 设置 .

    到目前为止一切都很好,但是 Settings User_Settings 性能 返回的 用户 对象位于 彼此没有联系 ( 除了 setting_id 当然领域 )

    有没有直接的方法从 设置 对应的属性 用户设置 财产?

    这是相应的查询:

            $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'));
    
    2 回复  |  直到 16 年前
        1
  •  0
  •   DuoSRX    16 年前

    实际上,您应该在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'));
      }
    }
    

    然后你会有一个教条记录而不是一个教条集。

        2
  •  0
  •   Vladimir Mihailenco    16 年前

    可以在用户设置类中定义缺少的关系:

    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',
            ));
        }
    }