2016-04-26 18 views
1

Ich versuche, eine Rasteransicht mit Viele-zu-viele-Beziehungen zu erstellen. Also ich brauche eine Abfrage für die ActiveDataProvider.Yii2-Datenprovider mit manyTomany-Beziehung

Ich habe eine Tabelle 'Ressource', eine Tabelle 'Typ' und zwischen ihnen eine Tabelle 'Historique'.

Ich habe die gute Beziehung in meinen Modellen, aber ich weiß nicht, wie Sie den DataProvider erstellen.

In meinem Modell 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']); 
} 

In meinem Modell Historique:

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

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

und schließlich in meinem Modell Typ:

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

So im Controller (in der Tat meines ModelSearch), möchte ich Ressourcen mit Typ aus der Tabelle historique haben. Ich weiß nicht, was ich habe hinzuzufügen, nachdem

Ressource::find(); 

Antwort

3

Ich glaube, Sie RessourceSearch()->search() Methode verwenden. Also im Inneren haben Sie so etwas wie dieses:

$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; 

Also, im Grunde, müssen Sie zusätzliche Where Sie Ihre Abfrage und Kraft hinzuzufügen Beziehungstabelle zu verbinden. Sie können das tun, indem Sie joinWith Methode verwenden, um zusätzliche Relation und andFilterWhere mit table.field Notation für das Hinzufügen von Filterparametern beizutreten. Zum Beispiel:

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

Vergessen Sie auch nicht Regeln für zusätzliche Filter in Ihrem Suchmodell hinzuzufügen. Zum Beispiel oben, sollten Sie mit Ihrem rules() Array so etwas hinzufügen:

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

Sie zusätzliche Validierungsregeln können für die

+0

Dank Felder ich nicht in der Nähe war. Ich habe nur eine letzte Frage: In der GridView, wenn ich GridView :: widget (['DataProvider' => $ DataProvider]) es funktioniert. Aber wenn ich nur einige Spalten in den Rasteransichtsattributen von anderen Tabellen als Ressource auswählen möchte, sind sie unbekannt. Was muss ich in Attribute aus der Gridview schreiben? –

+1

@ SamaëlVillette sollten Sie auch Punkt-Notation für Attribut oder Spalte Name 'relation.attribute' –

+0

Ich werde versuchen, danke für Ihre Antwort, es hat mir wirklich geholfen :) –