从YII2中的Active DataProvider中消除数据



我正在寻找一种通过ActiveDataProvider中数据旋转并删除一些行的方法。我的数据结构相当特殊,我无法获得->andFilterWhere

我需要的精确数据

我知道可以使用SqlDataProvider,但是我宁愿了解一种能够在ActiveDataProvider中的每一行中进行操作的方法,而只是解开了我不需要的那些。

我没有粘贴代码 - 我使用了通过GII生成的相当简单的控制器和模型 - 所以这里没有疯狂的。

如果有人可以将我指向正确的方向。

您可以做这样的事情:

        $dataProvider = new ActiveDataProvider(['query' => $query]);
        foreach ($dataProvider->models as $model) {
            //your logic
        }

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

仍然能够使用Active DataProvider并进行时髦的SQL查询,我想要很长一段路 - 我准备了一个前传递,这使我只给了我想要的行ID,然后我将它们传递到了ActivedAtaprovider的搜索中。

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

这样,我得到的是 - 我将主要查询限制为预选行。

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

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

但这是效率低下的(您正在创建不必要的模型),并且无法与分页合作(您可能会在页面上获得的记录要少于所需的记录,包括带有空页面的Edge Case)。最好的想法是在查询级别上过滤记录 - 如果您能够使用SQL过滤它们,则应该可以使用ActiveQuery进行此操作。应该使用andWhere()添加大多数条件,包括处理子查询:

$subquery = (new Query())->from(/* ... */)-> // ... rest of conditions
$dataProvider->query->andWhere(['customer_id' => $subquery]);

最新更新