关于yii2的gridview关联搜索步骤

  在使用yii2构建搜索视图,经常都会使用到gridview这个组件,这个组件十分强大,通过一定的配置就能进行关联搜索,下面就是简单的步骤

  需求场景:一个车系表,里面存放在品牌表的id,现在要用品牌名字进行like搜索对应的车系

  1、用gii生成一个与Model对应的Search;

  2、在Search中,增加一个属性,名为$brand_name;

class SeriesSearch extends Series
{

    public $brand_name;    // 品牌名字,随便起名

  3、在Search中search中,添加这两句代码;

public function search($params)
{
     $query = Series::find();

     $query->joinWith(['brand']);   // 连接品牌表,此处不用写全名

     $dataProvider = new ActiveDataProvider([
          'query' => $query,
          'sort'=>[
              'defaultOrder' => ['id'=>SORT_DESC]
           ]
     ]);

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

     $query->andFilterWhere([
         'id' => $this->id,
         'brand_id' => $this->brand_id,
         'level_id' => $this->level_id,
         'type_id' => $this->type_id,
         'is_hot' => $this->is_hot,
         'auto_series_id' => $this->auto_series_id,
         'status' => $this->status,
         'sort' => $this->sort,
         'min_price' => $this->min_price,
         'max_price' => $this->max_price,
         'car_total' => $this->car_total,
         'create_time' => $this->create_time,
         'update_time' => $this->update_time,
     ]);

     $query->andFilterWhere(['like', 'name', $this->name])
           ->andFilterWhere(['like', 'letter', $this->letter])
           ->andFilterWhere(['like', 'comments', $this->comments])
           ->andFilterWhere(['like', 't_brand.name', $this->brand_name]);  // 此处必须写表全名,而$this->brand_name指向的属性正是第二步中新增的属性

     return $dataProvider;
}

  4、此时,再来看看视图文件;

[
     'label' => '品牌',
     'attribute' => 'brand_name',  // 此处是第二步新增的属性名字
     'value' => 'brand.name',     // 不用写表全名
],

  5、到此,就大功告成了!

posted @ 2015-03-30 11:13  肖永标--专注web开发  阅读(945)  评论(0)    收藏  举报