我正在寻找一种通过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]);