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(); ?>




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章