Yii2 SqlDataProvider筛选器

Yii2 SqlDataProvider筛选器,yii2,filtering,Yii2,Filtering,我正在努力解决如何在我的网格中使用一个过滤器,当它是从 目前,我的模型是这样工作的: $sql = 'SELECT * FROM my_table'; $provider = new SqlDataProvider([ 'sql' => $sql, 'params' => [':start' => $param1, ':end' => $param2], 'totalCount' => $count, 'p

我正在努力解决如何在我的网格中使用一个过滤器,当它是从

目前,我的模型是这样工作的:

 $sql = 'SELECT * FROM my_table';
 $provider = new SqlDataProvider([
       'sql' => $sql,
       'params' => [':start' => $param1, ':end' => $param2],
       'totalCount' => $count,
       'pagination' => [
         'pageSize' => 100
        ],
     ]);
return $provider;
当没有活动记录时,应如何执行此操作?搜索模型似乎都基于AR并调用控制器:

$searchModel->search(Yii::$app->request->queryParams);
其中$searchModel函数的开头如下:

  public function search($params)
 {
    $query = myTable::find();

    // add conditions that should always apply here

    $dataProvider = new ActiveDataProvider([
        'query' => $query,
    ]);
    ...
$query = new Query;
$query->select('*')
    ->from('my_table');

// add conditions that should always apply here

$dataProvider = new SqlDataProvider([
    'sql' => $query->createCommand()->sql,
    'pagination' => [
        'pageSize' => 100
    ],
]);
我已经开始将search()函数更改为更像这样的函数,但不确定是否正确:

$query = new Query;
    $query->select('*')
          ->from('my_table');

    // add conditions that should always apply here

    $dataProvider = new SqlDataProvider([
      'sql' => $query,
      'pagination' => [
        'pageSize' => 100
       ],
    ]);
因为它与

preg_match()要求参数2为字符串,对象为给定值

对于一个模型的activeRecord(由gii生成),您有一个包含搜索函数的modelSearch.php

在本例中是用户模型serach

 /**
 * @param $params
 * @return ActiveDataProvider
 */
public function search($params)
{
    $query = $this->finder->getUserQuery();

    $dataProvider = new ActiveDataProvider([
        'query' => $query,
    ]);

    if (!($this->load($params) && $this->validate())) {
        return $dataProvider;
    }

    if ($this->created_at !== null) {
        $date = strtotime($this->created_at);
        $query->andFilterWhere(['between', 'created_at', $date, $date + 3600 * 24]);
    }

    $query->andFilterWhere(['like', 'username', $this->username])
        ->andFilterWhere(['like', 'email', $this->email])
        ->andFilterWhere(['registration_ip' => $this->registration_ip]);

    return $dataProvider;
}
过滤器功能通过以下各项的适当组合执行:

 $query->andFilterWhere(....) 
每一项都与正确的列名和参数变量有关,例如:

$query->andFilterWhere(['like', 'username', $this->username]);
如果您的模型或数据提供者需要类似的行为,您可以重复类似的模式

$query = new Query;
$query->select('*')
      ->from('my_table');
$query->andFilterWhere('start', $param1);

对于
SqlDataProvider
,您需要提供一个SQL字符串。在这里,您给出了一个查询对象,但您可以得到如下SQL:

  public function search($params)
 {
    $query = myTable::find();

    // add conditions that should always apply here

    $dataProvider = new ActiveDataProvider([
        'query' => $query,
    ]);
    ...
$query = new Query;
$query->select('*')
    ->from('my_table');

// add conditions that should always apply here

$dataProvider = new SqlDataProvider([
    'sql' => $query->createCommand()->sql,
    'pagination' => [
        'pageSize' => 100
    ],
]);

谢谢,我刚弄明白