2016-11-30 3 views
1

Я изо всех сил пытаюсь понять, как использовать фильтр в моей сетке, когда он сгенерирован из SqlDataProvider.SqlDataProvider filter

В настоящее время моя модель работает следующим образом:

$sql = 'SELECT * FROM my_table'; 
$provider = new SqlDataProvider([ 
     'sql' => $sql, 
     'params' => [':start' => $param1, ':end' => $param2], 
     'totalCount' => $count, 
     'pagination' => [ 
     'pageSize' => 100 
     ], 
    ]); 
return $provider; 

Когда не является активной записи, как это должно быть сделано? Модели поиска, кажется, все это может быть на основе АР и вызова в контроллере:

$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, 
     'pagination' => [ 
     'pageSize' => 100 
     ], 
    ]); 

в нем ошибки с

preg_match() ожидает параметр 2 будет строка, данный объект

ответ

2

Для SqlDataProvider вам необходимо указать строку SQL. Здесь вы указываете объект запроса, но вы можете получить такой SQL:

$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 
    ], 
]); 
+0

Спасибо, я только что понял это – Jonnny

1

Для ActiveRecord (генерируемого GII) realetd к модели имеют функцию modelSearch.php тха containt поисковую

В этом случай модели пользователя 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]); 

это, если что, если вам нужно подобное поведение для вас модель или DataProvider вы могли бы повторить подобный образец

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

Он не работает с SqlDataProvider. – nicolascolman

Смежные вопросы