一、模型配置事例会用到三个models。文章类别表和文章表用gii生成下即可,最后一个是搜索验证模型。其中,只讲下一个联表和搜索验证。其他不用操作。
1.文章表关联
<?php//...other code//关联public function getCate(){return $this->hasOne(ArticleCate::className(),["id" => "cid"]);}?>
2.搜索模型
common/models/search/创建ArticleSearch.php
<?phpnamespace commonmodelssearch;use Yii;use yiiaseModel;use yiidataActiveDataProvider;use commonmodelsArticle;class ArticleSearch extends Article{//public $cname;//文章类别名/** * @inheritdoc */public function rules(){return [[["cid","created_at", "updated_at"], "integer"],[["id", "desc","title","cover","content"], "safe"],];}/** * @inheritdoc */public function scenarios(){// bypass scenarios() implementation in the parent classreturn Model::scenarios();}//搜索public function search($params){$query = Article::find();// $query->joinWith(["cate"]);//关联文章类别表// $query->joinWith(["author" => function($query) { $query->from(["author" => "users"]); }]);$dataProvider = new ActiveDataProvider(["query" => $query,"pagination" => ["pageSize" => 2,],]);// 从参数的数据中加载过滤条件,并验证$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;}// 增加过滤条件来调整查询对象$query->andFilterWhere([// "cname" => $this->cate.cname,"title" => $this->title,]);$query->andFilterWhere(["like", "title", $this->title]);//$query->andFilterWhere(["like", "cate.cname", $this->cname]) ;return $dataProvider;}}
二、分页使用方式一首先在控制器的动作中,创建分页对象并且为其填充数据:
<?php//other codeuse yiidataPagination;public function actionArticlelist(){//分页读取类别数据$model = Article::find()->with("cate");$pagination = new Pagination(["defaultPageSize" => 3,"totalCount" => $model->count(),]);$model = $model->orderBy("id ASC")->offset($pagination->offset)->limit($pagination->limit)->all();return $this->render("index", ["model" => $model,"pagination" => $pagination,]);}?>
其次在视图中我们输出的模板为当前页并通过分页对象链接到该页:
<?phpuse yiiwidgetsLinkPager;use yiihelpersHtml;use yiihelpersUrl;//other codeforeach ($models as $model) {// 在这里显示 $model}// 显示分页echo LinkPager::widget(["pagination" => $pagination,"firstPageLabel"=>"First","prevPageLabel"=>"Prev","nextPageLabel"=>"Next","lastPageLabel"=>"Last",]);?>
方式二控制器:
<?php$query = Article::find()->with("cate");$provider = new ActiveDataProvider(["query" => $query,"pagination" => ["pageSize" => 3,],"sort" => ["defaultOrder" => [//"created_at" => SORT_DESC,//"title" => SORT_ASC,]],]);return $this->render("index", ["model" => $query,"dataProvider" => $provider]);?>
视图:
<?phpuse yiigridGridView;echo GridView::widget(["dataProvider" => $dataProvider,//每列都有搜索框 控制器传过来$searchModel = new ArticleSearch(); //"filterModel" => $searchModel,"layout"=> "{items}<div class="text-right tooltip-demo">{pager}</div>", "pager"=>[//"options"=>["class"=>"hidden"]//关闭自带分页"firstPageLabel"=>"First","prevPageLabel"=>"Prev","nextPageLabel"=>"Next", "lastPageLabel"=>"Last", ],"columns" => [//["class" => "yiigridSerialColumn"],//序列号从1开始// 数据提供者中所含数据所定义的简单的列// 使用的是模型的列的数据"id","username",["label"=>"文章类别", /*"attribute" => "cid",产生一个a标签,点击可排序*/ "value" => "cate.cname" ],["label"=>"发布日期","format" => ["date", "php:Y-m-d"],"value" => "created_at"],// 更复杂的列数据["label"=>"封面图","format"=>"raw","value"=>function($m){ return Html::img($m->cover,["class" => "img-circle","width" => 30]);}],["class" => "yiigridDataColumn", //由于是默认类型,可以省略 "value" => function ($data) {return $data->name; // 如果是数组数据则为 $data["name"] ,例如,使用 SqlDataProvider 的情形。},],[ "class" => "yiigridActionColumn", "header" => "操作","template" => "{delete} {update}",//只需要展示删除和更新 /*"headerOptions" => ["width" => "80"],*/ "buttons" => [ "delete" => function($url, $model, $key){ return Html::a("<i class="glyphicon glyphicon-trash"></i> 删除", ["artdel", "id" => $key],["class" => "btn btn-default btn-xs", "data" => ["confirm" => "你确定要删除文章吗?",] ]); },"update" => function($url, $model, $key){ return Html::a("<i class="fa fa-file"></i> 更新",["artedit", "id" => $key], ["class" => "btn btn-default btn-xs"]); },], ],],]);?>
三、搜索带分页功能- 创建搜索模型(前面己做)
- 控制传入数据
- 视图显示控制器代码:
<?phppublic function actionIndex(){ $searchModel = new ArticleSearch(); $dataProvider = $searchModel->search(Yii::$app->request->queryParams);return $this->render("index", ["searchModel" => $searchModel,"dataProvider" => $dataProvider,]); }?>
视图:
<?php $form = ActiveForm::begin(["action" => ["index"], "method" => "get", "id" => "cateadd-form", "options" => ["class" => "form-horizontal"],]); ?><?= $form->field($searchModel, "title",[ "options"=>["class"=>""], "inputOptions" => ["placeholder" => "文章搜索","class" => "input-sm form-control"],])->label(false) ?><?= Html::submitButton("Go!", ["class" => "btn btn-sm btn-primary"]) ?><?php ActiveForm::end(); ?><?= GridView::widget(["dataProvider" => $dataProvider,"layout"=> "{items}<div class="text-right tooltip-demo">{pager}</div>","pager"=>[//"options"=>["class"=>"hidden"]//关闭自带分页"firstPageLabel"=>"First","prevPageLabel"=>"Prev","nextPageLabel"=>"Next","lastPageLabel"=>"Last",], //这部分和上面的分页是一样的
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。