19

これに続いて:

Yii2 SearchModel の search() はどのように機能しますか?

GridViewリレーショナル データの列をフィルター処理できるようにしたいと考えています。これが私が意味することです:

私は2つのテーブルを持っていTableAますTableB. どちらにも、Gii を使用して生成された対応するモデルがあります。次のようTableAに、 の値への外部キーがあります。TableB

TableA
attrA1, attrA2, attrA3, TableB.attrB1

TableB
attrB1, attrB2, attrB3

attrA1 と attrB1 は、対応するテーブルの主キーです。

今、私は、およびの Yii2 を持っていGridViewます。列の値を検索できるように、とに機能するフィルターがあります。列ヘッダーをクリックするだけで、これら 2 つの列の並べ替えも実行できます。このフィルタリングとソートも追加できるようにしたいと思います。attrA2attrA3attrB2attrA2attrA3attrB2

私のTableASearchモデルは次のようになります。

public function search($params){
    $query = TableA::find();
    $dataProvider = new ActiveDataProvider([
        'query' => $query,
    ]);

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

    $this->addCondition($query, 'attrA2');
    $this->addCondition($query, 'attrA2', true);
    $this->addCondition($query, 'attrA3');
    $this->addCondition($query, 'attrA3', true);

    return $dataProvider;
}

私のTableAモデルでは、関連する値を次のように設定します

    public $relationalValue;

public function afterFind(){
    $b = TableB::find(['attrB1' => $this->attrB1]);
    $this->relationalValue = $b->relationalValue;
}

これはおそらく最善の方法ではありませんが。検索機能のどこかで $relationalValue を使用する必要があると思いますが、方法がわかりません。同様に、この列でもソートできるようにしたいと思います-ヘッダーリンクをクリックしattrA2てソートできるように. AttrA3どんな助けでも大歓迎です。ありがとう。

4

3 に答える 3

24

これは、ガイドの説明に基づいています。SearchModel のベース コードは、Gii コード ジェネレーターから取得されます。また、これは $this->TableB がhasOne()orhasMany()関係を使用して設定されていることを前提としています。このドキュメントを参照してください。

1.検索モデルの設定

TableASearchモデルに次を追加します。

public function attributes()
{
    // add related fields to searchable attributes
    return array_merge(parent::attributes(), ['TableB.attrB1']);
}

public function rules() 
{
    return [
        /* your other rules */
        [['TableB.attrB1'], 'safe']
    ];
}

次にTableASearch->search()追加します(の前に$this->load()):

$dataProvider->sort->attributes['TableB.attrB1'] = [
      'asc' => ['TableB.attrB1' => SORT_ASC],
      'desc' => ['TableB.attrB1' => SORT_DESC],
 ];

$query->joinWith(['TableB']); 

次に、データの実際の検索 (以下$this->load()):

$query->andFilterWhere([
    'like',
    'TableB.attrB1',
     $this->getAttribute('TableB.attrB1')
]);

2.設定GridView

ビューに追加:

echo GridView::widget([
    'dataProvider' => $dataProvider,
    'filterModel' => $searchModel,
    'columns' => [
        /* Other columns */
       'TableB1.attrB1',
        /* Other columns */        
     ]
]);
于 2014-04-09T10:16:21.933 に答える