Yii2设置模型数组中所有模型的属性值

时间:2018-07-12 09:53:27

标签: php arrays yii2 attributes

在yii2中,是否有一种方法可以在一组模型(同一类)中的所有模型中设置一个特定的属性值?我已经搜索过,但不幸的是没有发现任何相关信息。预先感谢!

2 个答案:

答案 0 :(得分:0)

您可以使用Model::loadMultiple( $models, $data, $formName = null );

这是您如何执行此操作的示例:

$numberOfModelsInArray = sizeof($myDataArray);
$myModels = [];
for ($i = 0; $i < $numberOfModelsInArray; $i++) {
     $myModels[] = new myModelForm();
}

VariantsForm::loadMultiple($myModels, $myDataArray, '');

要了解有关loadMultiple()的更多信息,可以检查https://www.yiiframework.com/doc/api/2.0/yii-base-model#loadMultiple()-detail 用于文档

答案 1 :(得分:0)

您也可以使用array_walk代替经典的foreach循环:

\array_walk($carArray, function(&$car) { $car->engine = 'electric'; });

另一种方法是将Model::loadMultiple与重复的数组一起使用:

Model::loadMultiple(
    $carArray,
    \array_fill(0, count($carArray), ['engine' => 'electric']),
    ''
);

最后一个参数是一个空字符串,以使Yii期望第二个参数的确切结构。


澄清后已过时:

ActiveRecord上有一个名为updateAll的静态方法:

Car::updateAll(['engine' => 'electric'], ['manufacturer' => 'Tesla']);
// UPDATE car SET engine = 'electric' WHERE 'manufacturer' = 'Tesla'

这会将特斯拉制造的所有汽车的engine属性设置为'electric'。如果您未在第二个参数中指定条件,则所有汽车都会更新。

如果绝对需要对已处理的数组执行此操作,则可以映射主键值,并将其作为值传递。您的条件将变成WHERE id IN(...)

$carArray = [$car1, $car2, $car3];
$carArrayIds = \array_map(function ($car) {
    return $car->id;
}, $carArray);

Car::updateAll(['engine' => 'electric'], ['id' => $carArrayIds]);
// UPDATE car SET engine = 'electric' WHERE 'id' IN (1, 2, 3)

最后但并非最不重要的一点是,如果所有这些都不可行,请尝试在单个数据库事务中更新所有模型。

$transaction = Yii::$app->db->beginTransaction();
try {
    foreach ($carArray as $car) {
        $car->engine = 'electric';
        if ($car->update() !== 1) {
            throw new \RuntimeException('Single car update failed');
        }
    }
} catch (\Exception $e) {
    $transaction->rollback();
}