2016-10-27 67 views
0

我已經使用了Gii AJAX Crud生成器,並且我被自己的愚蠢行爲拉上了牆。我正在使用Yii 2,並且希望使用Grid View在與交叉表中的ITSELF具有關係的表上使用Grid View進行多對多搜索。Yii2多對多通過網格視圖進行自我篩選(無屬性?)

table tag (id, name). 

table tag_child (parent_id, child_id) 


Class Tag 
... 
public function getParents() 
{ 
    return $this->hasMany(self::className(), ['id' => 'child_id']) 
     ->viaTable('tag_child', ['parent_id' => 'id']); 
} 

public function getChildren() 
{ 
    return $this->hasMany(self::className(), ['id' => 'parent_id']) 
     ->viaTable('tag_child', ['child_id' => 'id']); 
} 

在我網格視圖/列:

[ 
    'class' => '\kartik\grid\DataColumn', 
    'attribute'=>'name', 
], 
[ 
    'class' => '\kartik\grid\DataColumn', 
    'label' => 'Tag Type', 
    'value' => function($tag) { 
     return $tag->displayTagTypes(); 
    }, 
    'attribute' => 'tagTypes' 
], 


TagQuery.php 
... 
public $tagTypes; 
     public function search($params) 
{ 
    $query = Tag::find(); 

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

    $this->load($params); 

    if (!$this->validate()) { 
     // $query->where('0=1'); 
     return $dataProvider; 
    } 

    $query->joinWith('parents p'); 

    $query->andFilterWhere(['id' => $this->id]); 

    $query->andFilterWhere(['like', 'tag.name', $this->name]); 

    return $dataProvider; 
} 

我能與值函數來顯示我的索引表中的結果,但我的標籤過濾器是無法搜索通過tagTypes。我如何填充?作爲一個例子,當它不是很多很多時,我可以使用將我的屬性設置爲'joinedTableName.value',它在我添加$ query-> orFilterWhere('like','parent.name ',$ this-> id)或其他。但我現在處於虧損狀態......

回答

1

在你的控制器中聲明$ searchModel = new TagQuery(),然後將$ searchModel傳遞給視圖,並將其作爲'filterModel'=> $ searchModel包含在GridView選項中。

要麼是這樣,要麼是您可以使用特定filterTypes和每列過濾器邏輯來真正實現自定義過濾器。

您在查詢模型中聲明瞭公共tagType,但是您不會對它做任何事情。 $ query-> andFilterWhere(['like','tag.name',$ this-> tagType]);