我正在寻找一种方法来遍历ActiveDataProvider
中的数据并擦除一些行。我的数据结构比较特殊,->andFilterWhere
我知道可以使用SqlDataProvider
,但是我更希望了解一种能够对ActiveDataProvider
中的每一行进行foreach的方法,而只是取消设置那些我不需要的行。
我没有粘贴我的代码-我使用的是通过Gii生成的相当简单的控制器和模型-因此这里没有什么疯狂的。
如果有人能指出我正确的方向,我将感到非常高兴。
答案 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]);