您的位置:首页 > 编程语言 > PHP开发

Yii2.0-advanced-6—联表查询加搜索分页

2017-01-06 13:48 375 查看
Yii2.0中使用联表查询有两种办法,第一种是查询构建器(Query Builder),第二种使用活动记录(Active Record),中文网对查询构建器讲的很详细,AR则说的不够详细,下面贴出在yii2.0高级模板下联表查询及分页设置和前端显示方法,以供参考。

两个表

{{%article}} 和 {{%column}}

article.column_id关联column.id

1、要使用AR做关联查询,首先在models {Article} 中创建关联:

class Article extends \yii\db\ActiveRecord
{
//这里声明被关联字段 column_name 是自建属性,指 column 表中的 name
public $column_name;

/**
* @inheritdoc
*/
public static function tableName()
{
return '{{%article}}';
}
...
// 在文章模型中关联 column 表 一篇文章属于一个栏目 是一对一关系 用hasOne
public function getColumn(){
/**
* 第一个参数为要关联的表模型类,
* 第二个参数为关联字段 这里是:id 和 column_id
*/
return $this->hasOne(Column::className(), ['id' => 'column_id']);
}

}


2、在 ArticleSearch 中使用,

首先rule中要加上 column_name 字段验证,这让index中显示顶部的搜索表单

class BlogSearch extends Blog
{
/**
* @inheritdoc
*/
public function rules()
{
return [
[['id', 'views','column_id'], 'integer'],
[['title', 'content', 'created_at', 'updated_at','column_name'], 'safe'],
];
}
在search方法中加上分页条数设置:pagination参数

public function search($params)
{
$query = Article::find();
// add conditions that should always apply here

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

或者在控制器中这么写:

public function actionIndex()  

    {     

        $article = new Article();  

        #查询  

        $searchModel = new ArticleSearch();  

        $dataProvider = $searchModel->search(Yii::$app->request->queryParams);  

        #分页  

        $dataProvider->pagination = ['pagesize' => '3'];   

        return $this->render('index', [  

            'dataProvider' => $dataProvider,  

            'model' => $article,  

            'searchModel' => $searchModel,  

        ]);  

    }  

加上联表查询语句:

//联表查询
$query->joinWith(['column']);
$query->select('article.*,column.name');


加上模糊查询条件和字段排序:

/联表查询条件
$query->andFilterWhere(['like','column.name', $this->column_name]);
$dataProvider->sort->attributes['column_name'] =
[
'asc'=>['column.id'=>SORT_ASC],
'desc'=>['column.id'=>SORT_DESC],
];

3、在view中使用:

<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
'id',
'title',
['attribute'=>'column_name',
'label'=>'栏目',
'value'=>'column.name',
],
'views',
'created_at',
'updated_at',
['class' => 'yii\grid\ActionColumn'],
],
]); ?>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: