【问题标题】:Laravel MySQL JSON LIKE QueryLaravel MySQL JSON LIKE 查询
【发布时间】:2019-01-04 17:49:37
【问题描述】:

在 laravel 中使用 eloquent 我可以像这样使用 LIKE 查询:

Model::where('column', 'LIKE', 'a%');

即查询以字母 a 开头的列。如何在 json 列中做到这一点?

Model::where('meta->column', 'LIKE', 'a%');

我试过了,但没有得到任何结果,像这样查询它:

Model::where('meta->column', 'LIKE', '%a%');

返回列包含字母 a 的结果。我只想查询以字母a开头的列。

【问题讨论】:

    标签: mysql json laravel laravel-5.6 mysql-5.7


    【解决方案1】:

    在 MySQL 中,meta->column 的结果是 JSON 编码的。您必须添加前导引号:

    Model::where('meta->column', 'LIKE', '"a%');
    

    在 Laravel 5.6.28 中你可以使用 ->> operator:

    Model::where('meta->>column', 'LIKE', 'a%');
    

    【讨论】:

    • 这太棒了。我以前从来不知道它存在。
    • 请记住,无论您的架构或表的字符集/排序规则如何,这都会区分大小写。我只能在 json 列上找到 1 个不区分大小写的丑陋解决方案: ->whereRaw('LOWER(meta->"$.column") like ?', '%'.strtolower('a').'% '))
    【解决方案2】:

    我不确定这是否会起作用,但您可以试一试。它使用 MySQL 8 JSON search functions

    Model::where(DB::raw('meta->"$.column" LIKE "%a%"'))->get();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-26
      • 1970-01-01
      • 2017-01-03
      • 1970-01-01
      • 2016-08-16
      • 1970-01-01
      • 1970-01-01
      • 2011-10-04
      相关资源
      最近更新 更多