我有当前的结构化数据库和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语句嵌入到原始查询构建器函数中。
有什么想法吗?
答案 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个查询。