2017-03-11 14 views
0

私はこの問題があります。データベースからデータを取得してフィルタリングする必要があります。しかし、私はそれからのデータを使用してそれらのフィルタ結果をフィルタリングするカスタムPHP関数を使用する必要があります。カスタムPHP関数を使用してActiveDataProviderでフィルタリングする方法

ActiveDataProvider

でClasic検索機能
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; 
} 

だから私の質問は、私は、変数を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

なぜあなたはデータプロバイダで使用されるオブジェクトを照会するために、あなたのフィルタを追加していないのですか? 条件を構文解析して$query->andFilterWhere()にすることができます。カスタム関数が必要な場合は、関数内のオブジェクト$dataProvider->queryを変更するだけです。後あなたは手動でのみ結果使用を取得するには$dataProvider->models

+0

私は 'return $ dataProvider;の前に考えていた;私はforeach()読み込み専用ではありません。しかし、私はそれらをフィルタリングする必要があります$ query-> andFilterWhere()私はSQLを介して行うことができないいくつかのカスタムPHP関数を使用する必要がありますか? – Ripper

1

に保存されているモデルの配列をフィルタリングすることで、結果をフィルタリングすることができ、データプロバイダでクエリを実行しmodels propertyまたは例えば

getModels()

$dataProvider->models; 

OR

$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; 
関連する問題