0

cross-joinDoctrine_RawSqlを使用して 3 つの異なるテーブルをロードしています。これにより、次のオブジェクトが返されます。

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

上記のオブジェクトは、 と の関係の結果であり、many-to-many参照テーブルとして機能します。という名前の別のフィールドも含まれています。これには明らかに、対応する の値が含まれています。UserSettingUser_SettingUser_SettingvalueSetting

これまでのところすべて問題ありませんが、返されたオブジェクトのSettingsUser_Settings プロパティは互いにリンクされていません(フィールド ofcourseは別として)。Usersetting_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'));
4

2 に答える 2

0

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',
        ));
    }
}
于 2010-04-21T09:04:24.357 に答える
0

実際には ref テーブルで 1 対多の関係を定義する必要がありますが、 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_Collection の代わりに Doctrine_Record ができます。

于 2010-04-21T12:33:29.443 に答える