2017-03-11 3 views
0

이 문제가 있습니다. 데이터베이스에서 데이터를 가져 와서 필터링해야합니다. 하지만 그런 다음 사용자 지정 PHP 함수를 사용하여 필터링 된 결과를 그 데이터를 사용하여 필터링해야합니다. 사용자 정의 PHP 함수를 사용하여 ActiveDataProvider에서 필터링하는 방법

public function search($params) { 

    $query = Passenger::find(); 

    // add conditions that should always apply here 

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

    // I guess my function would go like here 
    Passenger::filterResultsEvenMore($dataProvider); 

    $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; 
    } 

    // grid filtering conditions 
    $query->andFilterWhere([ 
     'passenger_id' => $this->passenger_id, 
     // ... 
     'version' => $this->version, 
     'status' => $this->status, 
    ]); 

    return $dataProvider; 
} 

ActiveDataProvider

에서

CLASIC 검색 기능은 그래서 제 질문은 내가 변수를 vardump 경우는 다음과 같습니다없고, 거기에 실제 데이터 때문에 dataProvider의 결과로 작업하는 방법입니다.

yii\data\ActiveDataProvider Object 
(
    [query] => common\models\PassengerQuery Object 
     (
      [sql] => 
      [on] => 
      [joinWith] => 
      [select] => 
      [selectOption] => 
      [distinct] => 
      [from] => 
      [groupBy] => 
      [join] => 
      [having] => 
      [union] => 
      [params] => Array() 
      [_events:yii\base\Component:private] => Array() 
      [_behaviors:yii\base\Component:private] => Array() 
      [where] => Array 
       (
        [status] => 1 
       ) 
      [limit] => 
      [offset] => 
      [orderBy] => 
      [indexBy] => 
      [emulateExecution] => 
      [modelClass] => common\models\Passenger 
      [with] => 
      [asArray] => 
      [multiple] => 
      [primaryModel] => 
      [link] => 
      [via] => 
      [inverseOf] => 
     ) 
    [key] => 
    [db] => 
    [id] => 
    [_sort:yii\data\BaseDataProvider:private] => 
    [_pagination:yii\data\BaseDataProvider:private] => 
    [_keys:yii\data\BaseDataProvider:private] => 
    [_models:yii\data\BaseDataProvider:private] => 
    [_totalCount:yii\data\BaseDataProvider:private] => 
    [_events:yii\base\Component:private] => Array() 
    [_behaviors:yii\base\Component:private] => 
) 

UPDATE 나는 각 레코드에 대해 다음과 같은 기능을 사용할 필요가

:

if (myFunction(table_column_1, table_column_2)) { 
    result_is_ok_return_it 
} else { 
    do_not_return_this_record 
} 
+1

사용'$ dataProvider-> models' 결과를 얻으려면. –

+0

그게 쉽니? 내가 믿을 수 없어, 나는 약한 순간을 가졌다 고 생각한다. 고마워, 답장으로 써 주면 답을 줄 것이다. – Ripper

답변

1

가 왜 DataProvider에에서 사용되는 오브젝트를 조회하여 추가 필터를 추가하지 않습니다? 조건을 $query->andFilterWhere()으로 구문 분석 할 수 있습니다. 사용자 정의 함수가 필요한 경우 함수 내에서 $dataProvider->query 객체를 수정하면됩니다. 후 수동으로 만 결과 사용을 얻으려면 $dataProvider->models

+0

return $ dataProvider;를하기 전에 생각하고 있었다. foreach()와 unset models을 할 것이지만 만약 그렇다면 읽기 전용이므로 불가능합니다. 하지만 어떻게 그들을 필터링 할 수 있습니다 $ 쿼리 -> andFilterWhere() 내가 때 SQL을 통해 할 수없는 일부 사용자 지정 PHP 함수를 사용해야합니까? – Ripper

1

에 저장된 모델의 배열을 필터에 의해 결과를 필터링 할 수있는 데이터 공급자의 쿼리를 실행 models property 또는 예를 들어

getModels(),

$dataProvider->models; 

또는

$dataProvider->getModels(); 
0

솔루션을 발견했다고 생각합니다 (마치

http://www.yiiframework.com/doc-2.0/yii-data-basedataprovider.html#setModels()-detail 시작 부분에서 질문에 설명 된대로 내 모든 일반적인 검색 물건을 후

, 나는 setModels() 기능을 사용하여 같은 것을 할 것)하고있다

// ... 

    $filtered_models = []; 

    foreach ($dataProvider->models as $model) { 
     if ($model->status == 1) // example 
      $filtered_models[] = $model; 
    } 

    $dataProvider->setModels($filtered_models); 

    return $dataProvider; 
관련 문제