我有一个加载脚本,可将JSON文件插入数据库,使用AJAX和加载指示器将这个脚本执行了近50次。我想使用下面的插入结构来尽可能快地完成此操作,以避免执行单个插入语句带来的麻烦
INSERT INTO TABLE (COLUMN) VALUES ('value1'),('value2'),('value3')
如上例所示,要在laravel中生成SQL,我使用以下代码:
foreach ($album_data['data'] as $album) {
if (isset($album['name'])) {
$array['id'] = $album['id'];
$array['name'] = $album['name'];
$array['type'] = $album['type'];
$arr_albums[] = $array;
unset($array);
}
}
DB::table('ALBUM')->insert($arr_albums);
这在大多数情况下都有效,但是有时会发生关于重复键的错误,因为即使我首先检查已经存在的ID,此脚本也会针对出现相同相册的其他JSON输入立即触发几次。
这是当前的过程:
- 从JSON文件获取所有ID
- 在SELECT中使用这些ID来检查数据库中是否已存在这些ID
- 为不在数据库中的那些ID创建INSERT语句
当同时检查JSON文件中的2个或多个具有相同唱片集ID的AJAX请求(过程的2)并同时插入(过程的3)时,将发生错误。
我尝试通过在生成的SQL的末尾添加“ ON DUPLICATE KEY UPDATE ...”来解决此问题,因此我假设这样做是这样的:
$query = DB::table('ALBUM')->insert($arr_albums)->toSql();
$query .= " ON DUPLICATE...";
是什么导致此错误:
Call to a member function toSql() on boolean
我猜想在“ insert()”上不可能使用“ toSql()”函数吗?
我认为最简单的方法是使用表对象的语法:
$table = \DB::table('foo');
$sql = $table->getGrammar()->compileInsert($table, $mapping);
$updateSQL = $table->getGrammar()->compileUpdate($table, $mapping);
\DB::query($sql . ' ON DUPLICATE KEY ' . substr($updateSQL, strpos($updateSQL, ' set ')));
/ Illuminate / Database / Query / Grammars / Grammar具有以下功能:
/**
* Compile an insert statement into SQL.
*
* @param \Illuminate\Database\Query\Builder $query
* @param array $values
* @return string
*/
public function compileInsert(Builder $query, array $values)
/**
* Compile an update statement into SQL.
*
* @param \Illuminate\Database\Query\Builder $query
* @param array $values
* @return string
*/
public function compileUpdate(Builder $query, $values)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句