Model yii2从ActiveDataProvider中删除模型

Model yii2从ActiveDataProvider中删除模型,model,yii2,Model,Yii2,我有一个ActiveDataProvider,它包括几个型号。现在我需要删除其中一个模型。假设我的ActiveDataProvider名为$allproducts有6种型号。现在我需要从$allproducts中删除型号4。我怎样才能做到这一点 我试图在ActiveDataProvider中循环,如果出现某种情况,请删除模型。在我的示例中,型号4(项目编号4)标记为删除 foreach ($allproducts as $key => $product){ if ($value =

我有一个
ActiveDataProvider
,它包括几个型号。现在我需要删除其中一个模型。假设我的
ActiveDataProvider
名为
$allproducts
有6种型号。现在我需要从
$allproducts
中删除型号4。我怎样才能做到这一点

我试图在ActiveDataProvider中循环,如果出现某种情况,请删除模型。在我的示例中,型号4(项目编号4)标记为删除

foreach ($allproducts as $key => $product){
    if ($value == 'delete') {   // model 4, $value = 'delete'
        unset($allproducts[$key]);
    }
}
但我认为这不是一个合适的方式。yii2中是否有从
ActiveDataProvider
对象中删除模型的特定方法

正确的程序是什么?

您有两种选择:

1) 更改查询添加必要条件,例如:

$query = Model::find()->andWhere(['<>', 'value', 'deleted']);
$dataProvider = new \yii\data\ActiveDataProvider([
    'query' => $query
]);
$query=Model::find()->andWhere(['''value','deleted']);
$dataProvider=new\yii\data\ActiveDataProvider([
'query'=>$query
]);
2) 使用$dataProvider->model从ActiveDataProvider获取所有模型,循环返回的数组并删除不需要的项,例如:

$models = $dataProvider->models;
for($k=0;$k<count($models);$k++)
{
    if($models[$k]->value == 'deleted')
    {
        unset($models[$k]);
    }
}
$models=$dataProvider->models;
对于($k=0;$kvalue==‘已删除’)
{
未结算($models[$k]);
}
}

我更喜欢第一个,因为它更清楚。

有些人可能会问为什么要这样做?为什么不过滤查询中的数据,然后将其传递给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

取消设置模型。如果需要删除模型,为什么要在查询中获取该模型?对不起,我不明白?你这是什么意思?你试图删除一个由active dataprovider返回的记录,我是说,如果你以后必须删除它,为什么不在返回dataprovider之前过滤掉它呢?它是一个基于datagridview记录的“虚拟”数据提供程序。在datagridview中有一个可编辑列。如果在列中进行了更改,将调用控制器操作。在这个控制器函数中,我必须向ActiveDataProvider添加一个“虚拟”行(模型/项目),或者在删除的情况下从ActiveDataProvider中删除“虚拟”模型。之后,数据网格将被更新。添加一个“虚拟”行很好,但是删除(从datagrid中删除一行)会让我头疼!我的做法与您的第二个解决方案类似,因为它是一个虚拟数据提供者。这样我就担心ActiveDataProvider,因为ActiveDataProvider还有一个“keys”元素。我想我也要取下相应的钥匙吗?此外,当我使用未设置的方法删除模型手册时,是否必须重新组织密钥?从$models中删除模型后,可以填充ArrayDataProvider(而不是ActiveDataProvider):$dataProvider=new\yii\data\ArrayDataProvider(['allModels'=>$models]);我认为这是正确的方法。