YII2原生SQL分页支持排序搜索

YII2默认情况下会生成一个直接操作单表的模型并且具备搜索和分页以及排序功能,在很多复杂的业务逻辑需求中,单表操作很难实现我们想要的效果,此时我要是选择的话就用纯sql来做,不用考虑那么多的对应关系,而且你得SQL语句执行效率越高,程序执行的效率也就越高。


OK我们来看看怎么实现。


一、首先我们来看一个需求:在一个博客的首页中,需要显示博客列表,列表中(作者,文章标题,发表时间,文章分类,评论数量)需要显示。

二、建表

yii_article(文章):[id,title,publish_time,user_id,cate_id,content,sort]

yii_cate(分类):[id,cate_name,pid,sort]

yii_user(用户):[id,uname,realname,uemail,password_hash,password_reset_token,auth_key]

yii_comment(评论):[id,user_id,comment_time,content,pid,article_id]


三、SQL语句

SELECT `yii_user`.`realname`,`yii_article`.*,`yii_cate`.`cate_name`,(select count(`yii_comment`.`id`) from `yii_comment` where `yii_comment`.`article_id`=`yii_article`.`id`) as `comment_num` FROM `yii_article` LEFT JOIN `yii_user` ON `yii_user`.`id`=`yii_article`.`user_id` LEFT JOIN `yii_cate` ON `yii_cate`.`id`=`yii_article`.`cate_id`

四、实现

模型

ArticleSearch.php

public function search($params)
{
    $sql="SELECT `yii_user`.`realname`,`yii_article`.*,`yii_cate`.`cate_name`,(select count(`yii_comment`.`id`) from `yii_comment` where `yii_comment`.`article_id`=`yii_article`.`id`) as `comment_num`  FROM `yii_article` LEFT JOIN `yii_user` ON `yii_user`.`id`=`yii_article`.`user_id` LEFT JOIN `yii_cate` ON `yii_cate`.`id`=`yii_article`.`cate_id`";
    $get=Yii::$app->request->get();

    if ($id = $get['ArticleSearch']['id']) {
        $sql.=" WHERE `yii_article`.`id`=".$id;
    }
    //这些搜索条件你都可以一个个加上,为了节约时间我就只写id一个了
    $rows=Article::findBySql($sql)->all();

    $dataProvider = new SqlDataProvider([
        'sql' => $sql,
        //'params' => [':status' => 1],
        'totalCount' => count($rows),
        'sort' => [
            'attributes' => [
                'id'=>[
                    'asc' => ['yii_article.id' => SORT_ASC],//yii_article.id如果你不是多表你可以直接写id
                    'desc' => ['yii_article.id' => SORT_DESC],
                    'default' => SORT_ASC,
                    'label' => 'ID-NUM',
                ],
            ],
        ],
        'pagination' => [
            'pageSize' => 5,
        ],

    ]);
    $this->load($params);

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

    return $dataProvider;
}

控制器文件  ArticleController.php

public function actionIndex()
    {

        $searchModel=new ArticleSearch();
        $dataProvider=$searchModel->search(Yii::$app->request->queryParams);
        $models = $dataProvider->getModels();


        return $this->render('index', [
            'models'=> $models,
            'page'=>$dataProvider->pagination,
            'sort'=>$dataProvider->sort,
            'searchModel'=>$searchModel,
        ]);

    }

视图文件  view/article/index.php

        <?php

        foreach ($models as $res) {
            echo $res['id'].'->->->>'.$res['title'];
            echo "<br/>";
        }
        ?>
        //排序
        <?php
        echo $sort->link('id') . ' | ';
        //分页
        echo LinkPager::widget([
            'pagination' => $page,
        ]);
        ?>

        //搜索表单
        <?php $form = ActiveForm::begin([
            'action' => ['index'],
            'method' => 'get',
        ]); ?>

        <?= $form->field($searchModel, 'id') ?>

        <?= $form->field($searchModel, 'user_id') ?>

        <?= $form->field($searchModel, 'cate_id') ?>

        <?= $form->field($searchModel, 'publish_time') ?>

        <div class="form-group">
            <?= Html::submitButton('Search', ['class' => 'btn btn-primary']) ?>
            <?= Html::resetButton('Reset', ['class' => 'btn btn-default']) ?>
        </div>

        <?php ActiveForm::end(); ?>




郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。