我必须从现有的表数据中创建大量数据。数量大约是每天5000到10000个数据。
我的控制器:
$skus = Sku3d::find()->all();
foreach ($skus as $sku) {
$model = new Loghour3d();
$model->sku = $sku->sku;
$model->modeler = $sku->modeler;
$model->team = $sku->team;
$time = new \DateTime('now');
$today = $time->format('Y-m-d');
$model->day = $today;
$model->handover = $sku->handover;
$model->hour = $sku->totalhours;
$model->save();
}
但创造的时间不正确。示例:$sku->totalhours = 12
但$model->hour = 600
,我的代码为$model->hour = $sku->totalhours;
。所以我不知道600
来自哪里。
还有更好的方法来完成这项任务,因为现在大约需要15-20分钟。
答案 0 :(得分:3)
如果您想加快从数据库处理大量数据的速度,您应该首先使用ActiveRecord
。在数组上操作并使用DAO应该比为每条记录创建ActiveRecord
对象更有效。
第二 - 您应该使用batchInsert()
在一个查询中插入多个记录。在一个查询中插入100条记录比在100个单独的查询中执行更快。
第三 - 如果每条记录的某些值相同,请在foreach之前移动它。如果它总是相同的话,没有必要计算当前日期10000次。
$skus = Sku3d::find()->asArray()->all();
$time = new \DateTime('now');
$today = $time->format('Y-m-d');
$toInsert = [];
foreach ($skus as $sku) {
$toInsert[] = [
'sku' => $sku['sku'],
'modeler' => $sku['modeler'],
'team' => $sku['team'],
'day' => $today,
'handover' => $sku['handover'],
'hour' => $sku['totalhours'],
];
}
Yii::$app->db->createCommand()
->batchInsert(
Loghour3d::tableName(),
[
'sku',
'modeler',
'team',
'day',
'handover',
'hour',
],
$toInsert
)
->execute();