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