雄辩的whereRaw无法使用绑定

时间:2019-10-10 14:28:31

标签: laravel eloquent laravel-6

我的数据库中有一个带有法语字符的json列。所以当我使用:

App\Job::where('name->fr', 'like', '%Fune%')->count();

找不到名称为Funéraire之类重音的作业的结果。我可以使用whereRaw在查询中添加归类来完成我想要的事情:

App\Job::whereRaw('json_unquote(json_extract(`name`, \'$."fr"\')) LIKE \'%Fune%\' collate utf8mb4_general_ci')->count();

但是,当我在whereRaw方法中使用绑定时:

App\Job::whereRaw('json_unquote(json_extract(`name`, \'$."fr"\')) LIKE ? collate utf8mb4_general_ci', ['%Fune%'])->count();

我收到数据库错误:

  

COLLATION'utf8mb4_general_ci'对于字符集'binary'无效(SQL:从jobs中选择count(*),其中json_unquote(json_extract(name,'$。“ fr”'))像%Fune%整理utf8mb4_general_ci)

只是想知道为什么我通过绑定传递它时不起作用。

2 个答案:

答案 0 :(得分:0)

中国。

如果数据库中有一个JSON列,则可以直接在该列上触发类似查询,因为JSON是一个字符串,而%text%则搜索该字符串中的文本。

您不必为查找相同的名字而经历很多麻烦。

您的查询可能看起来像这样

App\Job::where('name_of_column_of_json', 'like', '%Fune%')->count();

,您将获得所需的输出。

点击它,让我们知道,它是否有效。

答案 1 :(得分:0)

您需要将绑定转换为UTF-8:

App\Job::whereRaw(
    'json_unquote(json_extract(name, \'$."fr"\')) LIKE convert(? using utf8mb4)', 
    ['%Fune%']
)