【问题标题】:How to use custom php function to filter in ActiveDataProvider如何使用自定义 php 函数在 ActiveDataProvider 中进行过滤
【发布时间】:2017-03-11 09:04:59
【问题描述】:

我有这个问题:我需要从数据库中获取数据并过滤它们。但随后我需要使用自定义 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;
}

所以我的问题是如何处理 dataProvider 的结果,因为如果我对变量进行 vardump,它看起来像这样并且那里没有实际数据。

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] => 
)

更新

我需要对每条记录使用这样的函数:

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

【问题讨论】:

  • 使用$dataProvider->models 得到结果。
  • 就这么简单吗?我不敢相信,我猜我当时很虚弱,谢谢伙计,如果你把它写成回复,我会给它评分

标签: yii2 dataprovider


【解决方案1】:

为什么不向 DataProvider 中使用的查询对象添加额外的过滤器? 您可以将您的条件解析为$query->andFilterWhere()。如果您需要自定义函数,只需修改函数内的 $dataProvider->query 对象。在数据提供者中执行查询后,您只能通过手动过滤存储在$dataProvider->models中的模型数组来过滤结果

【讨论】:

  • return $dataProvider; 之前我在想我会做 foreach () 和 unset 模型,但如果那是只读的,那就不可能了。但是,当我需要使用一些无法通过 sql 完成的自定义 php 函数时,如何过滤 $query->andFilterWhere() 中的那些?
【解决方案2】:

要获得结果,请使用 models propertygetModels()

例如,

$dataProvider->models;

$dataProvider->getModels();

【讨论】:

    【解决方案3】:

    我想我遇到了一个解决方案,(看起来它正在工作)

    http://www.yiiframework.com/doc-2.0/yii-data-basedataprovider.html#setModels()-detail

    在我按照开头所述的所有常规搜索内容完成之后,我会使用 setModels() 函数执行类似的操作

    class PassengerSearch extends Passenger
    
        public $status; // virtual attribute not present in database table
    
        public function rules()
        {
            return [
                // ... some other rules
                [['status'], 'safe'],
            ];
        }
    
        // ...
    
        $filtered_models = [];
        $filter_models = false; // if you only want to filter if there is some value
    
        foreach ($dataProvider->models as $model) {
            // if ($model->status == 1) // example
            if (!empty($this->status) && $model->status == $this->status) { // better approach, using virtual attribute $status
                $filter_models = true;
                $filtered_models[] = $model;
            }
        }
    
        if ($filter_models)
            $dataProvider->setModels($filtered_models);
    
        return $dataProvider;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-05
      相关资源
      最近更新 更多