Yii2创建了大量数据

时间:2018-04-26 06:13:06

标签: 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();
}

但创造的时间不正确。示例:$sku->totalhours = 12$model->hour = 600,我的代码为$model->hour = $sku->totalhours;。所以我不知道600来自哪里。

还有更好的方法来完成这项任务,因为现在大约需要15-20分钟。

1 个答案:

答案 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();