Yii2.0 search 搜索类
先给出一个search类的代码:
<?php
namespace commonmodels;
use Yii;
use yiiaseModel;
use yiidataActiveDataProvider;
use commonmodelsVPost;
use yiidbQuery;
use yiihelpersHtmlPurifier;
/**
1. VPostSearch represents the model behind the search form about `commonmodelsVPost`.
*/
class VPostSearch extends VPost
{
/**
* @inheritdoc
*/
public function rules()
{
return [
[["id", "answer_num", "user_id", "created_at", ], "integer"],
//注意,rules方法可以是post类部分字段,也可以是全部字段
];
}
/**
* @inheritdoc
*/
public function scenarios()
{
// bypass scenarios() implementation in the parent class
return Model::scenarios();
}
/**
* Creates data provider instance with search query applied
*
* @param array $params
*
* @return ActiveDataProvider
*/
public function search($params)
{
$query = VPost::find();
$dataProvider = new ActiveDataProvider([
"query" => $query,
]);
$this->load($params, "");
if (!$this->validate()) {
/* uncomment the following line if you do not want
to return any records when validation fails*/
// $query->where("0=1");
return $dataProvider;
}
//过滤发生在此处
$query->andFilterWhere([
"id" => $this->id,
"answer_num" => $this->answer_num,
"user_id" => $this->user_id,
"lecture_id" => $this->lecture_id,
"board_id" => $this->board_id,
"course_id" => $this->course_id,
"created_at" => $this->created_at,
"last_commented_at" => $this->last_commented_at,
]);
return $dataProvider;
}
}
这里有几点需要注意:
1. load()方法无法加载参数,那么需要注意一下,load()方法的第二个参数formname,load方法进行如下处理:
$this->load($params, "");
2 . 有时候,会有这种需求,即需要的dataProvider并不是通过已有的字段进行过滤获取,比如需要将记录按时间排序,我们不希望在 $query = VPost::find()之后进行orderby,这样处理会使所有的查询都会按照时间进行排序。
例如:在视图页有‘全部’和‘最新’两个选项卡,点击‘最新’时,将查询结果按照时间字段倒序排,实现方式如下:
第一步:视图层带参
//视图层‘最新’选项卡
<?php echo Html::a( "最新", ["/crowdfund/default/index","newest"=>1] ); ?>
当点击时,newest参数就会通过下面的方法获取:
public function actionIndex()
{
$searchModel = new VCrowdfundSearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
return $this->render("index", [
"searchModel" => $searchModel,
"dataProvider" => $dataProvider,
]);
}
//这段代码,就是利用search类的search方法,将参数load进去,并进行过滤
但是虽然视图传递参数newest,但是search模型怎么识别呢?这就需要在search模型里定义该字段并加入rules规则中。
第二步:定义变量,并添加到rules方法中
public $newest;
加入rules方法
return [
[["id", "target_amount","newest"], "integer"],
[["title", "description", "syllabus"], "string"],
];
第三步:变量newest判断,并过滤dataProvider
if($this->newest !== null){
$query->orderBy(["created_at"=> SORT_DESC]);
}
提示:可以利用这种方式,实现非常复杂的查询。在Yii框架中,所有的查询都应该通过search方法实现,除非你的需求非常特殊,特殊情况下可以实例化 ActiveDataProvider进行查询。
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。