如何使用原始Laravel在json_contains中设置变量?

时间:2019-05-24 15:28:08

标签: mysql json laravel

通过使用(1)

,我从laravel请求中获得了想要的结果。 但是,一旦我将硬编码的“鱼”切换到$ str ='fish'之类的变量,我就会收到语法错误。

(1) $find = animal::whereRaw('JSON_CONTAINS(animal_category, \'{"item_text": "fish"}\')')->get();

例如,我已经在几乎所有地方使用'或`或'尝试了各种变体:

$find = animal::whereRaw("JSON_CONTAINS(animal_category, \'{'item_text': $str}\')")->get();

$str = 'fish'
$str2 = "\'{'item_text': $str}\'"
$find = animal::whereRaw("JSON_CONTAINS(animal_category, $str2)")->get();

但是我在尝试什么都没关系,总是语法错误或为空,因为请求ist寻找“ $ str2”。

我也尝试不使用\ {"item_text": "fish"}。还是语法错误...

我应该怎么做才能得到与硬编码示例相同的结果?

我的设置: Laravel 5.8,MySQL 5.7.14

非常感谢您。 =)

其他信息MySQL列动物看起来像

[{"item_id": 1, "item_text": "fish"}, {"item_id": 6, "item_text": "birds"}]

也许还有另一种方法,即json_contains,可以通过where子句获取数据? :)

2 个答案:

答案 0 :(得分:0)

使用

$str2 = "\'{\"item_text\": $str}\'"

代替

$str2 = "\'{'item_text': $str}\'"

JSON不喜欢使用单个'字符来包含字符串。它要求使用双字符:"

答案 1 :(得分:0)

您始终可以使用jsonContains()方法:

$find = animal::whereJsonContains('animal_category', ['item_text' => $fish])->get();

要回答您的实际问题,要获得所需的内容,您可以:

whereRaw('JSON_CONTAINS(animal_category, \'{"item_text":"' . $fish . '"}\')')

whereRaw("JSON_CONTAINS(animal_category, '{\"item_text\":\"$fish\"}')")

但是,我强烈建议您这样做,因为它会使您易于进行sql注入(取决于您如何获取$fish变量)。

要解决这个问题,您可以像这样绑定值:

whereRaw('JSON_CONTAINS(animal_category, ?)', '{"item_text":"' . $fish . '"}')