,我从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子句获取数据? :)
答案 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 . '"}')