【问题标题】:Laravel DB::raw() failed but work in mysql directlyLaravel DB::raw() 失败但直接在 mysql 中工作
【发布时间】:2021-06-21 03:44:07
【问题描述】:

我在 Laravel 中运行一个 sql:

$last_reading_comprehension_id = DB::select(
    DB::raw("
        INSERT INTO `npee_reading_comprehensions`(npee_id) VALUES ($npee->id),($npee->id),($npee->id),($npee->id);
        SELECT LAST_INSERT_ID();
    ")
);

这将失败并出现错误


但是当我直接在mysql中运行sql时,它可以工作

为什么会这样?怎么解决,万分感谢!

【问题讨论】:

  • 看起来您的 DB::select 不支持批处理执行(多查询),因此您的批处理中的第二个查询失败。
  • @Akina 非常感谢您的回复! DB::raw()里面肯定只能运行一条sql

标签: mysql laravel


【解决方案1】:

语法错误。

更正查询:INSERT INTO npee_reading_comprehensions(npee_id) VALUES ('$npee->id'),('$npee->id'),('$npee->id'),('$npee- >id'); 选择 LAST_INSERT_ID();

【讨论】:

  • 感谢您的回复!但我试过了,我确定这不是由`引起的
【解决方案2】:

我刚刚找到了一个类似的答案。 here

不确定您的 laravel 版本是什么,但是,要在 laravel 中执行 2 个查询,我建议在链接和引用中提到的单独数据库查询中执行:

没有办法在一个查询中执行此操作(除非您使用的是 Laravel 5.7),但是我遇到了同样的问题并想确保我可以继续使用我使用 QueryBuilder 构建的某个选择。

 /**
  * Wherever your Select may come from
  **/
  $select = SELECT LAST_INSERT_ID();
  /**
   * get the binding parameters
   **/ 
  $bindings = $select->getBindings();
  /**
   * now go down to the "Network Layer"
   * and do a hard coded select, Laravel is a little
   * stupid here
   */
  $insertQuery = 'INSERT into npee_reading_comprehensions(npee_id) VALUES($npee->id),($npee->id),($npee->id),($npee->id)) '
            . $select->toSql();

  \DB::insert($insertQuery, $bindings);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-12
    • 2017-08-02
    • 2016-03-21
    • 2018-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    相关资源
    最近更新 更多