雄辩的 whereRaw 不适用于绑定

Posted

技术标签:

【中文标题】雄辩的 whereRaw 不适用于绑定【英文标题】:Eloquent whereRaw is not working with bindings 【发布时间】:2020-02-08 00:55:36 【问题描述】:

我的数据库中有一个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' 对 CHARACTER SET 'binary' 无效(SQL: select count(*) from jobs where json_unquote(json_extract(name, '$."fr"')) LIKE %Fune%整理 utf8mb4_general_ci)

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

【问题讨论】:

这个错误其实更正确。 mysql 中 JSON 列的排序规则始终是二进制 unicode 排序规则。 @apokryfos 但是,如果我使用原始查询,为什么它会起作用? 我推测:原始字符串将匹配连接的编码,而不是列。准备好的字符串将匹配列的编码。 utf8mb4_general_ci 排序规则可能不适用于列编码,但适用于连接编码 这对我有用:whereRaw('json_unquote(json_extract(name, \'$."fr"\')) LIKE convert(? using utf8mb4)', ['%Fune%']) @Adam 我有默认排序规则,但这不适用于 json 列。 【参考方案1】:

下巴。

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

您不必费心寻找相似的名字。

您的查询可能有点像这样,

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

你会得到想要的输出。

点击它并告诉我们,它是否有效。

【讨论】:

我已经试过了。这是我的第一次尝试,但正如我在问题中提到的,它不适用于具有法语字符的结果,例如 Funéraire。只有当我改为查询 %Fun% 时它才会起作用。 必须尝试传递“Funé”作为输入,我想这会起作用。 这就是我的问题的重点......即使我搜索Fune,我也希望它能够找到结果......我知道如果我用重音搜索它会起作用。【参考方案2】:

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

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

【讨论】:

不得不使用这个:convert(? using utf8mb4) collate utf8mb4_general_ci

以上是关于雄辩的 whereRaw 不适用于绑定的主要内容,如果未能解决你的问题,请参考以下文章

模型绑定不适用于嵌套对象

XAML 绑定不适用于依赖属性?

JsonConverter 不适用于模型绑定

用于嵌套 jsonb 的雄辩的 Where 子句。 PostgreSQL

PDO 案例存在不适用于绑定参数

RxUI ObservableAsPropertyHelper 不适用于 XAML 绑定