2016-04-26 9 views
1

多対多の関係を持つグリッドビューを構築しようとしています。だから私はActiveDataProviderのクエリが必要です。manytomany関係を持つYii2データプロバイダ

私はテーブルのressource '、テーブル「タイプ」と、それらの間にテーブル「ヒストリーク」を持っています。

私のモデルには良い関係がありますが、dataProviderの作成方法はわかりません。私のモデルRessourceで

:私のモデルでは

public function getHistorique() 
{ 
    return $this->hasMany(Historique::className(), ['idType' => 'idType']); 
} 



public function getType() 
{ 
    return $this->hasMany(Type::className(), ['idType' => 'idType']) 
     ->viaTable(Historique::className(), ['idRessource' => 'idRessource']); 
} 

に歴史:私のモデルタイプで

public function getType() 
{ 
    return $this->hasOne(Type::className(), ['idType' => 'idType']); 
} 

public function getRessource() 
{ 
    return $this->hasOne(Ressource::className(), ['idRessource' => 'idRessource']); 
} 

、最終的には:だから

public function getHistorique() 
{ 
    return $this->hasMany(Historique::className(), ['idType' => 'idType']); 
} 
public function getRessource() 
{ 
    return $this->hasMany(Ressource::className(), ['idRessource' => 'idRessource']) 
     ->viaTable(Historique::className(), ['idType' => 'idType']); 
} 

コントローラで(実際には私のModelSearch)、私はテーブルのhistoriqueからタイプのressourcesを持っています。私はあなたがRessourceSearch()->search()メソッドを使用すると思います

Ressource::find(); 

答えて

3

後に追加する必要がありますかわかりません。

$query = Ressource::find(); 

$dataProvider = new ActiveDataProvider([ 
    'query' => $query, 
]); 

if (!($this->load($params) && $this->validate())) { 
    return $dataProvider; 
} 

// Here is list of searchable fields of your model. 
$query->andFilterWhere(['like', 'username', $this->username]) 
     ->andFilterWhere(['like', 'auth_key', $this->auth_key]) 


return $dataProvider; 

だから、基本的に、あなたが関係テーブルを結合するための追加Whereあなたのクエリと力を追加する必要があります。だから、内部のあなたは、このような何かを持っています。追加の関係を追加するにはjoinWithメソッドを使用し、フィルタパラメータを追加するにはtable.fieldの表記を使用してandFilterWhereを使用します。例:

$query = Ressource::find(); 
$query->joinWith(['historique', 'type']); 
$query->andFilterWhere(['like', 'type.type', $this->type]); 
$query->andFilterWhere(['like', 'historique.historique_field', $this->historique_field]); 

検索モデルに追加のフィルタのルールを追加することも忘れないでください。それは私が近くにありませんでした

+0

感謝をフィールドに対してあなたは追加の検証ルールを使用することができます

public function rules() { return [ // here add attributes rules from Ressource model [['historique_field', 'type'], 'safe'], ]; } 

:上記の例の場合、あなたはそのようなあなたのrules()配列何かに追加する必要があります。私はちょうど最後の質問があります:GridViewで私はGridView :: widget(['dataProvider' => $ dataProvider])を使うと動作します。しかし、グリッドビューの一部の列を選択したいときは、ressource以外の表の属性は不明です。グリッドビューの属性に何を書き込む必要がありますか? Samaë[email protected] –

+1

あなたも、私はあなたの答えのために、この感謝をしようとする属性または列名 'relation.attribute' –

+0

するために、ドット表記を使用する必要があり、それは本当に私を助け:) –

関連する問題