我有一个包含多个模型的ActiveDataProvider。现在我需要删除其中一个模型。让我说我的ActiveDataProvider名为$ allproducts有6个模型。现在我需要从$ allproducts中删除模型4。我怎样才能做到这一点?
我正在尝试循环ActiveDataProvider,如果condition = delete,则删除该元素。在我的示例中,模型4(项目编号4)被标记为删除。
foreach ($allproducts as $key => $product){
if ($value == 'delete') { // model 4, $value = 'delete'
unset($allproducts[$key]);
}
}
但我认为这不是正确的方法。是否有一种特定的yii2方法从ActiveDataProvider中删除模型?或者什么是正确的程序?
答案 0 :(得分:1)
您有两种选择:
1)更改查询添加必要条件,例如:
$query = Model::find()->andWhere(['<>', 'value', 'deleted']);
$dataProvider = new \yii\data\ActiveDataProvider([
'query' => $query
]);
2)使用$ dataProvider-&gt;模型从ActiveDataProvider获取所有模型,循环返回数组并删除不需要的项目,例如:
$models = $dataProvider->models;
for($k=0;$k<count($models);$k++)
{
if($models[$k]->value == 'deleted')
{
unset($models[$k]);
}
}
我更喜欢第一种,因为它更清楚。
答案 1 :(得分:0)
有人可能会问为什么要这样做?为什么不只过滤查询中的数据,然后将其传递给dataProvider?这就是为什么有时需要检查与MySQL不相关的内容的原因,也许您想调用模型函数来获取数据库中不存在的属性。在这种情况下,最好的选择就是我的示例:
if($dataProvider->count > 0){
$me = Yii::$app->user->id;
$models = $dataProvider->models;
foreach($models as $k => $model){
if(!in_array($me, $model->audienceUsers)){
unset($models[$k]);
}
}
$dataProvider->setModels($models);
}
请记住,您不能直接从$dataProvider->models
取消模型设置