Yii到Yii2中的Search()函数


Search() function in Yii to Yii2

我是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
    ];
}