在Laravel-4中批量插入具有关系的对象


Batch Insert Objects With Relations in Laravel-4

我遇到了一种情况,需要在laravel 4中批量保存对象及其相关对象。从本质上讲,我所做的是大量插入对象,其中每个对象都可以有许多标记(多对多关系)。

以下是一些示例代码,请注意TODO注释:

 [...]
 $batchData = array();
 $rowCount  = 0;
 foreach ($dataArray as $key => $row) {
        [...]
        // parsing row from CSV
        $obj = array();
        foreach ($row as $attribute => $value) {
            $obj['template_id'] = $templateId;
            $obj['batch_id']    = $batchId;
            $obj['user_id']     = $confideUserId;
            $obj['created_at']  = new 'DateTime;
            $obj['updated_at']  = new 'DateTime;
            // Attach Tags if any exist
            if ($attribute === 'tags') {
                if (!is_null($value) || !is_empty($value)) {
                    $tags = explode(":", $value);
                    // TODO: Get tag ID for each tag and add to $obj['tags'] array
                }
            }               
        }
        // add object to array
        $batchData[$rowCount] = $obj;
        ++$rowCount;
        if ($rowCount == 'Config::get('app.maxCSV')) {
            try {
                // TODO: Batch Insert With Related tags??
                $obj_model_name::insert($batchData);
            } catch (Exception $e) {
                return false;
            }
            $rowCount  = 0;
            $batchData = array();
        }
    }
    [...]

我可以一个接一个地插入每个对象及其关系,但问题是我们通过CSV批量插入这些对象,在CSV中我们可以有数百到数十万个对象。

有人有什么建议吗?

仅供参考,使用的数据库是MSSQL 2012。

干杯,

在进一步研究之后,我得出的结论是,最好重新考虑我的逻辑。现在,在将标记指定给每个对象之前,我将分别保存该对象,并对所有对象重复此操作。

当有很多对象时,这可能不是有效的,但到目前为止,这还不是一个可预见的问题。