Laravel 雄辩的whereRaw不使用绑定

Laravel 雄辩的whereRaw不使用绑定,laravel,eloquent,laravel-6,Laravel,Eloquent,Laravel 6,我的数据库中有一个json列,带有法语字符。因此,当我使用: App\Job::where('name->fr', 'like', '%Fune%')->count(); 它不会为名称中带有重音的工作(如Funéraire)查找结果。我可以通过使用whereRaw在查询中添加一个collate来完成我想要的: App\Job::whereRaw('json_unquote(json_extract(`name`, \'$."fr"\')) LIKE \'%Fune%\' colla

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

App\Job::where('name->fr', 'like', '%Fune%')->count();
它不会为名称中带有重音的工作(如
Funéraire
)查找结果。我可以通过使用
whereRaw
在查询中添加一个collate来完成我想要的:

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();
我收到一个数据库错误:

排序规则“utf8mb4_general_ci”对于字符集“binary”(SQL:从
作业中选择count(*)无效,其中json(json_extract(
name
,“$”fr“)类似于%Fune%collate utf8mb4_general_ci)

我只是想知道,当我用绑定传递它时,为什么它不工作。

Chin

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

你不必费这么大的劲就能找到相似的名字

您的查询可能有点像这样

App\Job::where('name_of_column_of_json', 'like', '%Fune%')->count();
您将获得所需的输出


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

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

App\Job::whereRaw(
类似于convert(?using utf8mb4)’的,
[“%Fune%”
)

这个错误实际上更正确。MySQL中JSON列的排序始终是二进制unicode排序。@apokryfos但是如果我使用原始查询,为什么会起作用呢?我推测:原始字符串将匹配连接的编码,而不是列。准备好的字符串将与列的编码匹配。
utf8mb4\u general\u ci
排序规则可能不适用于列编码,而它适用于连接编码这对我来说是有效的:
whereRaw(
json\u-extract(
name
,\'$.fr“\”)类似convert(?using utf8mb4)、['%Fune%'))
@Adam我有默认排序规则,但这对json列不起作用。我已经尝试过了。这是我的第一次尝试,但正如我在问题中提到的,它不适用于具有法语字符的结果,例如
Funéraire
。只有当我查询
%Fun%
时,它才会起作用。我必须尝试将“Funé”作为输入传递,我想这会起作用。这就是我的问题所在。。。我想让它找到结果,即使我搜索
Fune
。。。我知道如果我用重音搜索,它会起作用。必须使用这个:
convert(?using utf8mb4)collate utf8mb4\u general\u ci