消除Yii2中来自活动数据提供者的数据

时间:2019-02-26 17:18:37

标签: yii2

我正在寻找一种方法来遍历ActiveDataProvider中的数据并擦除一些行。我的数据结构比较特殊,->andFilterWhere

无法获得所需的精确数据

我知道可以使用SqlDataProvider,但是我更希望了解一种能够对ActiveDataProvider中的每一行进行foreach的方法,而只是取消设置那些我不需要的行。

我没有粘贴我的代码-我使用的是通过Gii生成的相当简单的控制器和模型-因此这里没有什么疯狂的。

如果有人能指出我正确的方向,我将感到非常高兴。

3 个答案:

答案 0 :(得分:0)

您可以执行以下操作:

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

        foreach ($dataProvider->models as $model) {
            //your logic
        }

答案 1 :(得分:0)

好的,我找到了答案,所以我想分享。

为了仍然能够使用活动的dataprovider并进行时髦的sql查询,我需要很长的路要走-我准备了一个预查询,该查询只给了我想要的行的id,然后将它们传递给ActiveDataProvider的搜索中的普通搜索查询。

    $query->andFilterWhere([
        'customer_id' => $tempids,

通过这种方式,我得到的是-我将主查询仅限于预选的行。

答案 2 :(得分:0)

您可以使用getModels()setModels()修改数据提供程序中可用的模型列表:

$models = $dataProvider->getModels();
foreach ($models as $index => $model) {
    if (/* some condition */) {
        unset($models[$index]);
    }
}

$dataProvider->setModels($models);

但是这效率低下(您正在创建不必要的模型),并且无法在分页中正常工作(您在页面上获得的记录可能比您想要的少,包括带有空白页面的边缘情况)。最好在查询级别过滤记录-如果您可以使用SQL过滤记录,则应该可以使用ActiveQuery进行过滤。应该可以使用andWhere()添加大多数条件,包括处理子查询:

$subquery = (new Query())->from(/* ... */)-> // ... rest of conditions

$dataProvider->query->andWhere(['customer_id' => $subquery]);