Sao*_* Ho 0 yii2 yii2-basic-app
我必须从现有的表数据中创建大量数据。每天大约有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();
}
Run Code Online (Sandbox Code Playgroud)
但是创建的时间不正确。示例:$sku->totalhours = 12但是$model->hour = 600我的代码是$model->hour = $sku->totalhours;. 所以我不知道从哪里来600。
还有没有更好的方法来完成这项任务,因为现在大约需要 15-20 分钟。
如果你想加快处理来自数据库的大量数据,你首先应该放弃使用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();
Run Code Online (Sandbox Code Playgroud)