我是Yii框架的新手,现在我需要在Yii2中创建一个搜索函数。我已经在Yii中找到了一个搜索函数,它看起来和我需要的函数完全一样。
这是代码:
public function searchDocuments($documentModel, $query, $content=false, $content_only=false) {
$criteria = new CDbCriteria();
$criteria->with = array(
'tags' // Tabel tbl_tag toevoegen via de relations.
);
$criteria->compare('content', $query, true, "OR");
$criteria->compare('description', $query, true, "OR");
$criteria->compare('year', $query, true, "OR");
$criteria->compare('title', $query, true, "OR");
$criteria->compare('tags.slug', $query, true, "OR");
$criteria->compare('title', $documentModel->title, true, "AND");
$criteria->compare('description', $documentModel->description, true, "AND");
$criteria->compare('tags.slug', $documentModel->tag_search, true, "AND");
$criteria->compare('year', $documentModel->year, true, "AND");
$criteria->compare('tags.state', 1 , false, "AND");
$criteria->group = 't.id';
$criteria->together = true;
return new CActiveDataProvider( $documentModel, array(
'pagination'=>array('pageSize'=>25),
'criteria' => $criteria,
'sort'=>array(
'attributes'=>array(
'tag_search'=>array(
'asc'=>'tags.slug',
'desc'=>'tags.slug DESC',
),
'*',
),
),
)
);
}
使用Yii2Gii为您的模型生成CRUD。它生成了ModelSearch模型,其代码包含了搜索代码的良好示例。
upd。使用模型关系和$query->joinWith()方法并按相关表进行筛选。
// model
public function getTags()
{
return $this->hasMany(Tags::className(), ['id' => 'document_id']);
}
// search model
public function search($params)
{
...
$query->joinWith(['tags' => function ($q) {
$q->where('tags.slug LIKE "%' . $this->tag . '%"');
}]);
...
}
在您的模型中
public static function search($params)
{
$query = self::find();
$query->andWhere(['or','content',$params['content']]);
$query->andWhere(['like','title',$params['title'].'%',false]);
$query->with(['tags']);
$query->groupBy('id');
$countQuery = clone $query;
$pages = new Pagination(['totalCount' => $countQuery->count(),'defaultPageSize'=>20]);
$datas = $query->offset($pages->offset)
->limit($pages->limit)
->all();
return [
'datas' => $datas,
'pages' => $pages
];
}