复制Laravel 5.4

时间:2017-07-14 15:36:17

标签: mysql laravel eloquent laravel-5.4 laravel-query-builder

我有当前的结构化数据库和Eloquent模型。

文档

ID

信息页

id, document_id

资产

id, page_id

所以我的文档有很多页面有很多资产。

我的文档模型中有一个非常难看的方法,到目前为止,迭代所有页面然后资产并复制它们存储新的外键与新记录。

    foreach ($pages as $page) {
        $replicatedPage = $page->replicate();
        $replicatedPage->document_id = $newDocument->id;
        $replicatedPage->save();

        foreach ($page->assets as $asset) {
            $replicatedAsset = $asset->replicate();
            $replicatedAsset->page_id = $replicatedPage->id;
            $replicatedAsset->save();
        }
    }

不幸的是,由于人们上传近200页每页200个资产(总共40,000个资产),现在变得非常缓慢。

我也查看了saveMany()函数,但是它通过遍历所述ID来完成我正在做的事情。

我真正需要的是一个很好的查询构建器,可以在SQL级别复制所有这些,但我无法弄清楚如何执行此操作。甚至可以将原始SQL语句嵌入到原始查询构建器函数中。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

使用insert()方法加快速度。渴望加载文档及其所有页面和资源,迭代这些数据并为每个表构建一个数组。 pages表的示例(对assets表执行相同的操作):

$replicatedPages = [];
foreach ($pages as $page) {
    $replicatedPages[] = $page->toArray(); // Probably you'll need to remove ID column.
}
Page::insert($replicatedPages);

使用这种方法,您只需执行两个查询即可插入所有文档的页面和资源,而不是执行40000个查询。