【问题标题】:check the manual that corresponds to your MariaDB server version for the right syntax to use near '>video_id=89'查看与您的 MariaDB 服务器版本相对应的手册,了解在 '>video_id=89' 附近使用的正确语法
【发布时间】:2018-08-28 19:16:23
【问题描述】:

我使用的是 Laravel 5.5,但无法使用以下查询删除通知。它给出了以下错误:

SQLSTATE[42000]:语法错误或访问冲突:1064 你有一个 SQL 语法错误;检查与您对应的手册 MariaDB 服务器版本,用于在 '>video_id=89' 附近使用正确的语法 在第 1 行(SQL:从 notifications 删除 data->video_id=89)。

DB::table('notifications')->WhereRaw("data->video_id=$video_id")->delete();

【问题讨论】:

  • 您的查询中的data 来自哪里?您是否尝试删除连接?
  • 因为在通知表中它存储这样的数据。 “数据”:{“video_id”:89 }

标签: mysql laravel laravel-5 mariadb laravel-query-builder


【解决方案1】:

你为什么使用 data->video_id

试试看

WhereRaw("video_id=$video_id")

【讨论】:

  • WhereRaw != Where。这个错误laravel.com/docs/5.6/queries#raw-expressions
  • 因为在通知表中它存储这样的数据。 “数据”:{“video_id”:89 }。
  • OP 正在尝试在 JSON 对象中进行查询。在 Laravel 中,您可以在查询中使用 -> 运算符,但前提是底层数据库支持它。
【解决方案2】:

-> 运算符是 MySQL 中 JSON_EXTRACT() 函数的简写。不幸的是,MariaDB 不支持这种速记语法。

MariaDB 确实在 10.2.3 中引入了 JSON_* 函数,但我不知道它们是否适用于查询中的列。你能做的最好的事情就是尝试。您需要重写查询以明确使用JSON_EXTRACT() 函数:

DB::table('notifications')
    ->whereRaw('JSON_EXTRACT(data, "$.video_id") = ?', [$video_id])
    ->delete();

如果这不起作用,那么您要么需要从 MariaDB 切换到 MySQL,要么需要将查询重写为简单的字符串搜索(使用 LIKE 运算符)。

【讨论】:

  • 上面的查询给出了错误“SQLSTATE[42000]:语法错误或访问冲突:1305 FUNCTION wittylab_wittylab.JSON_EXTRACT 不存在(SQL:从notifications 中删除,其中 JSON_EXTRACT(data, "$.video_id ") = 89)"
  • @MD.MazharulIslam 这意味着您要么不在 MariaDB >=10.2.3 上,要么该功能在查询中不起作用。无论哪种方式,看起来您都必须使用纯文本搜索(LIKE 运算符)
猜你喜欢
  • 1970-01-01
  • 2017-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-12
  • 1970-01-01
  • 2023-02-05
  • 1970-01-01
相关资源
最近更新 更多