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