使用多个AJAX请求进行laravel 5.2 mysql批量插入,toSql()错误

干草

我有一个加载脚本,可将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输入立即触发几次。

这是当前的过程:

  1. 从JSON文件获取所有ID
  2. 在SELECT中使用这些ID来检查数据库中是否已存在这些ID
  3. 为不在数据库中的那些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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章