yii2从ActiveDataProvider中删除模型

时间:2018-03-05 18:23:02

标签: model yii2

我有一个包含多个模型的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中删除模型?或者什么是正确的程序?

2 个答案:

答案 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取消模型设置