gpt4 book ai didi

mysql - 查询生成器中的 Laravel 转义字符

转载 作者:行者123 更新时间:2023-11-29 07:15:36 25 4
gpt4 key购买 nike

我正在编写一个查询:

$result = \DB::table('order_items as oi')
->selectRaw(
'order_item_type as item_type,
order_item_id as item_id,
if(order_item_type = "App\\\Models\\\Book", oi.price, invoices.price) as price
)

请注意if语句,我必须使用两个转义字符或查询与App\Models\Book不匹配。当我通过 laravel 调试器检查输出查询时:

select order_item_type as item_type,
order_item_id as item_id,
if(order_item_type = "App\\Models\\Book", oi.price, invoices.price) as price,...

这里发生了什么? laravel 查询生成器是否删除一个斜杠,然后 mysql 引擎在运行时删除第二个斜杠?

编辑:
但在同一个查询的其他地方,我有一个 where 子句,我使用了一个转义字符,它工作得很好:

 ->leftjoin('books', function ($q) {
$q->on('q3.order_item_id', '=', 'books.id')
->where('q3.order_item_type', '=', 'App\\Models\\Book');
})

以及 laravel 调试器的输出查询部分:

left join `books` on `q3`.`order_item_id` = `books`.`id` and 
`q3`.`order_item_type` = 'App\Models\Book'

任何人都可以解释为什么在if中我必须使用两个转义字符,但在join中仅使用一个转义字符需要吗?
事实上,如果我在 where 查询构建器方法中不使用任何转义字符并将代码编写为:

  ->leftjoin('books', function ($q) {
$q->on('q3.order_item_id', '=', 'books.id')
->where('q3.order_item_type', '=', 'App\Models\Book');
})

最佳答案

都是 PHP 1和 MySQL 2转义斜杠。另一方面,MySQL 要求它们转义,除非 NO_BACKSLASH_ESCAPES 3 SQL 模式已启用 - 默认情况下处于禁用状态。在 MySQL 中,转义序列要么被解释,要么被忽略 - \n 将被转换为新行,\m 被忽略并被转换为 m .

因此,第一个 PHP 会将 \\\ 转换为 \\ - 两个转义为一个。然后 MySQL 也会将 \\ 转义为 \,了解您想要一个文字斜杠。 :)

关于您的编辑,selectRaw() 会将原始查询发送到 MySQL,因此您必须自己转义数据。所有其他非原始方法都在 Laravel 查询生成器内部执行此操作,因此您不必担心这些事情。

与 MySQL 不同,PHP 不会忽略斜杠。使用单引号字符串,任何非结尾斜杠都将被识别为文字,因此您不需要转义它们 - 如果您的字符串以斜杠结尾,那么您就需要转义它们。对于双引号字符串,有一些转义序列会被翻译 - 您的示例仍然可以使用它们,但在某些情况下可能会出错。

关于mysql - 查询生成器中的 Laravel 转义字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38067907/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com