【问题标题】:yii2 Removing a model from ActiveDataProvideryii2 从 ActiveDataProvider 中移除一个模型
【发布时间】:2018-03-05 18:23:02
【问题描述】:

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

我试图在 ActiveDataProvider 中循环,并在某些情况下删除模型。在我的示例中,Model 4(项目编号 4)被标记为删除。

foreach ($allproducts as $key => $product){
    if ($value == 'delete') {   // model 4, $value = 'delete'
        unset($allproducts[$key]);
    }
}

但我认为这不是正确的方法。 yii2 中是否有特定方法可以从ActiveDataProvider 对象中删除模型?

什么是正确的程序?

【问题讨论】:

  • 如果您需要删除它,为什么要在查询中获取该模型
  • 对不起,我不明白?你是什​​么意思?
  • 您正在尝试删除活动数据提供者返回的记录,我是说如果您必须在之后删除它,为什么不通过活动数据提供者获取该记录,为什么不在返回数据提供者之前将其过滤掉
  • 它是一个“虚拟”数据提供者,基于数据网格视图的记录。在 datagridview 中有一个可编辑的列。如果在列中进行了更改,将调用控制器操作。在这个控制器函数中,我必须向 ActiveDataProvider 添加一个“虚拟”行(模型/项目),或者在删除的情况下从 ActiveDataProvider 中删除“虚拟”模型。之后,Datagrid 将被更新。添加一个“虚拟”行很好,但是删除,从数据网格中删除一行,让我有些头疼!

标签: model yii2


【解决方案1】:

你有两个选择:

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

$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]);
    }
}

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

【讨论】:

  • 我的做法与您的第二个解决方案类似,因为它是一个虚拟 DataProvider。这样我就担心 ActiveDataProvider,因为 ActiveDataProvider 还有一个“keys”元素。我想我也必须删除相应的密钥?此外,当我使用 unset 方法删除模型手册时,是否必须重新组织键?
  • 从 $models 中删除模型后,您可以填充一个 ArrayDataProvider(而不是 ActiveDataProvider): $dataProvider = new \yii\data\ArrayDataProvider(['allModels' => $models]);我认为这是正确的方法。
【解决方案2】:

有些人可能会问为什么要这样做?为什么不只过滤查询中的数据,然后将其传递给 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-&gt;models取消设置模型

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    • 2015-10-13
    • 1970-01-01
    • 1970-01-01
    • 2020-11-07
    • 1970-01-01
    相关资源
    最近更新 更多