2017-06-30 17 views
0

グループhasManyユーザとユーザbelongsToManyグループのような関連付けを構築する必要があります。CakePHPアソシエーション関係テーブル

しかし、私は、それは常に間違ったテーブルを使用して正しい結果を得ることができない代わりに、groups_relations

マイモデル:

class GroupsTable extends Table 
{ 
    public function initialize(array $config) 
    { 
     $this->setTable('groups'); 
     $this->setDisplayField('title'); 
     $this->setPrimaryKey('id'); 

     $this->hasMany('Users', [ 
      'joinTable'  => 'groups_relations', 
      'foreignKey' => 'user_id', 
     ]); 
    } 
} 


class UsersTable extends Table 
{ 
    public function initialize(array $config) 
    { 
     $this->table('user_users'); 
     $this->belongsToMany('Groups', [ 
      'joinTable'  => 'groups_relations', 
      'foreignKey' => 'group_id', 
     ]); 

    } 
} 

class GroupsRelationsTable extends Table 
{ 
    public function initialize(array $config) 
    { 
     parent::initialize($config); 

     $this->setTable('groups_relations'); 
     $this->setDisplayField('group_id'); 
     $this->setPrimaryKey('id'); 

      $this->belongsTo('Groups', [ 
       'foreignKey' => 'group_id', 
       'joinType' => 'INNER' 
       ]); 

      $this->belongsToMany('Users', [ 
       'foreignKey' => 'user_id', 
       'joinType' => 'INNER' 
       ]); 

     } 
} 

そして、私のテーブルgroups_relations

id | group_id |私は中間のテーブルを使用して配列にreusltsを追加ケーキに伝える方法を理解することはできません

$groupsWithUsers = $this->Groups->find('all', array(
     'contain' => array('Users') 
     )); 

:user_idを

私は、クエリを実行します。

答えて

0

リレーションテーブルを最初から選択するのではなく、リレーションシップを使用しようとするよりも、これはケーキのやり方のようです。すべてのデータを元に戻す場合は、条件句を除外できます。

$groupsWithUsers = $this->GroupsRelations->find('all', array(
    'contain' => ['Users', 'Groups'], 
    'conditions' => ['Group.id' => $id] 
    ) 
); 

はさらに、このに見た後、私は私が使用していますが、その中間のテーブルを使用してbelongsToMany必要まさに合うように思われていない何かを発見しました。ユーザー用のテーブルファイルに次のものを追加します。同様のエントリがグループページに追加されます。

$this->belongsToMany('Groups', [ 
     'through' => 'GroupRelations', 
    ]); 
+0

ええ、私はそれについて考えましたが、laravelのような$ user-> groupsと$ group-> usersが好きです。 – dkruchok

+0

私はあなたの答えがあると思います。あなたが必要とするものを正確に実行するように見える** through **テーブルのオプションがあります。私は上記のエントリに例を追加しました。ここには本のリンクがあります。 https://book.cakephp.org/3.0/en/orm/associations.html#using-the-through-option – KaffineAddict

1

joinTablehasMany協会の有効な構成キーではありません。私はグループbelongsToManyを持っていると思う。これに関するもう一つの手掛かりは、がbelongsToの「反対側」であり、belongsToManyがそれ自身の反対であるということです。つまり、A hasMany Bの場合はB belongsTo A、A belongsToMany Bの場合はB belongsToMany A)。Groupsとのユーザーとの関連付けをbelongsToに変更することもできます。

あなたが焼いたこのコードはありますか?それはよりよく知っているはずですから。スティッキーなアソシエーションの問題に遭遇したとき、私はときどきケーキにモデルコードを焼き付け、私が書いたものと結果がどのように違うかを見ます。

関連する問題