牛骨文教育服务平台(让学习变的简单)
博文笔记

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

创建时间:2017-01-06 投稿人: 浏览次数:2592

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

两个表

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

article.column_id关联column.id

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

class Article extends yiidbActiveRecord
{
    //这里声明被关联字段 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,
            ],
        ]);

或者在控制器中这么写:

  1. public function actionIndex()  
  2.     {     
  3.         $article = new Article();  
  4.         #查询  
  5.         $searchModel = new ArticleSearch();  
  6.         $dataProvider = $searchModel->search(Yii::$app->request->queryParams);  
  7.         #分页  
  8.         $dataProvider->pagination = ["pagesize" => "3"];   
  9.         return $this->render("index", [  
  10.             "dataProvider" => $dataProvider,  
  11.             "model" => $article,  
  12.             "searchModel" => $searchModel,  
  13.         ]);  
  14.     }  


加上联表查询语句:

//联表查询
        $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" => "yiigridActionColumn"],
        ],
    ]); ?>

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。