Yii2.0 关联搜索

效果:

效果

假设 bolg 表中的 user_iduser 表中的 id 关联


首先,建立两表的关联关系

模型blog 中,修改 attributeLabels() 方法, 并 增加getUser() 方法,

use common\models\User; // 记得引用
//...
public function attributeLabels()
{
	// 文字修改成中文
    return [
        'id' => 'ID',
        'title' => '标题',
        'content' => '内容',
        'create_time' => '创建时间',
        'status' => '状态',
        'username' => '作者', // 增加这个字段
    ];
}

// ...

// 建立两表关联
public function getUser()
{
    return $this->hasOne(User::className(), ['id'=>'user_id']);
}

视图 index.php

<?= GridView::widget([
    'dataProvider' => $dataProvider,
    'filterModel' => $searchModel,
    'columns' => [
        // ['class' => 'yii\grid\SerialColumn'],

        'id',
        'title',
        // 得出的是user对象
        [
            'attribute' => 'username', // username是要实现搜索的关键字段,后面会增加
            'value' =>'user.username'
        ],
        'content:ntext',
        [
            'format' => 'html', // 表示此列内容为html格式,输出时不会被转义
            'filter' => [ // 过滤器,也就是搜索框。该值为数组时会显示一个下拉框(dropdown list)
                BlogForm::STATUS_HIDE => '隐藏',
                BlogForm::STATUS_SHOW => '显示',
            ],
            'attribute' => 'status', // 字段名
            'value' => function ($model){ // 该列内容
                if($model->status == BlogForm::STATUS_HIDE) return '<span class="label label-danger">隐藏中</span>';
                if($model->status == BlogForm::STATUS_SHOW) return '<span class="label label-success">显示中</span>';
            },
        ],
        'create_time:datetime',

        ['class' => 'backend\column\BlogColumn'],
    ],
]); ?>

这时候,就出现我们要的 作者名字了,但还没有 搜索框搜索功能.


在搜索模型 BlogSearch.php 中 做如下修改 (关键)

增加 attributes() 方法, 重写父类attributes(),并把 username 属性字段 加入.

public function attributes()
{
	return array_merge(parent::attributes(),['username']);
}
// ...

做搜索框 把 username 加入搜索的规则中 (这一步会出现搜索框)

public function rules()
{
    return [
        [['id'], 'integer'],
        [['title', 'content', 'create_time', 'status','username'], 'safe'],
    ];
}
// ...

做搜索功能 修改search()方法

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

    // add conditions that should always apply here

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

    $this->load($params);

    if (!$this->validate()) {
        // uncomment the following line if you do not want to return any records when validation fails
        // $query->where('0=1');
        return $dataProvider;
    }

    // grid filtering conditions
    $query->andFilterWhere([
        'id' => $this->id,
        'create_time' => $this->create_time,
        'blog.status' => $this->status,
    ]);

    $query->andFilterWhere(['like', 'title', $this->title])
        ->andFilterWhere(['like', 'content', $this->content]);

	// 这里开始增加code----------------------------------------------------------

	// blog表中 user_id 和 user表的 id 相关联
    $query->join('INNER JOIN', 'user', 'blog.user_id = user.id' );

	// 模糊匹配查找
    $query->andFilterWhere(['like', 'user.username', $this->username]);

	// 实现username的排序
    $dataProvider->sort->attributes['username']= [
        'asc' =>['user.username'=>SORT_ASC],
        'desc'=>['user.username'=>SORT_DESC],
    ];

    return $dataProvider;
}

至此, 关联字段的搜索排序 都好了~




导航