2017-01-25 2 views
0

Yii 2.0で多対多リレーションシップを使用して接続/接合テーブルの値にフィルタを適用するにはどうすればよいですか?Yii 2ジャンクションテーブルの値に多対多の関係をフィルタリングします

私は、次の表を持っているメンバーは、彼らが受け入れられるか、モデルファイルEvent.phpから

を拒否している場合は、整数を伝えると、EventMemberConnectionを通じてイベントに接続されている

Member (id INT, name, ...) 
Event (id INT, name, date, ...) 
EventMemberConnection (id INT, event_id INT, member_id INT, accepted TINYINT(1) DEFAULT 0, foreign keys....) 

/** 
* @return \yii\db\ActiveQuery 
*/ 
public function getAcceptedMembers() { 
    return $this->hasMany(Member::className(), ['id' => 'member_id'])->viaTable('EventMemberConnection acceptedConnection', ['event_id' => 'id'])->onCondition(['acceptedConnection.accepted' => 1]); 
} 

/** 
* @return \yii\db\ActiveQuery 
*/ 
public function getDeclinedMembers() { 
    return $this->hasMany(Member::className(), ['id' => 'member_id'])->viaTable('EventMemberConnection declinedConnection', ['event_id' => 'id'])->onCondition(['declinedConnection.accepted' => 0]); 
} 

残りのコントローラ内のクエリ:

public function prepareDataProvider() { 
    $query = Event::find(); 

    $query->joinWith('acceptedMembers acceptedMember'); 
    $query->joinWith('declinedMembers declinedMember'); 

    $query->groupBy(['Event.id']); 

    return new ActiveDataProvider([ 
     'query' => $query 
    ]); 
} 

私は、REST APIを使用して、acceptedMembersとdeclinedMembersの両方で拡張されたイベントオブジェクトを取得しています。私は、メインクエリは罰金行ったことを推測

Column not found: 1054 Unknown column 'acceptedConnection.accepted' in 'where clause' 
The SQL being executed was: SELECT * FROM `Member` `acceptedMember` WHERE (`id` IN ('5', '9')) AND (`acceptedConnection`.`accepted`=1) 

が、Yiiのは、それはOnConnectionに関数の中で使用される条件を追加し、関連するメンバーを取り出し、余分な呼び出し:私は、呼び出しから次のデータベースエラーが発生します。

私はdocumentationで、関連テーブルのみでフィルタリングし、接合テーブルではフィルタリングしないと仮定しています。だから私はonConditionが行く方法だとは思わない。

ジャンクションテーブルに設定された値にリレーションをフィルタリングする方法はありますか?

+1

お問い合わせはどこですか?クエリには結合がありません。 –

+0

ありがとう、私は質問に追加しました。 –

答えて

1

documentationでは、joinクエリをカスタマイズするために使用できるviaTable()関数にコールバックを追加できることがわかりました。このように使用できます: