在有说服力的原始查询mysql json上使用and运算符有问题

ecr0jaav  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(365)

我正在尝试找出正确的语法,以便在下面雄辩的原始查询中添加and运算符,在该查询中,我正在查询mysql(5.7.9)表的json字段。在这样做时,我希望能够有案件不敏感的能力。
在对如何实现这一点做了初步研究之后,我的代码基本上是这样工作的:

$users = User::whereRaw('lower(info_json->"$.full_name") like lower(?)', ["%{$user_name}%"])

但我的目标是添加一个and操作符,用一个非json varchar列进一步缩小结果范围。
我尝试过这个(以及其他没有成功的变体):

$users = User::whereRaw('lower(info_json->"$.full_name") like lower(?)', 'and user_type = admin', ["%{$user_name}%"])

这给了我一个错误:“数组到字符串的转换”
我也尝试过:

$users = User::whereRaw('lower(info_json->"$.full_name") like lower(?) and user_type = admin', ["%{$user_name}%"])

这给了我以下错误:“sqlstate[42s22]:column not found:1054 unknown column'user\u type'in'where子句”
其他没有导致错误的类似变化产生了太多或太少的结果。
如何成功地调整语法,以查询具有正确结果的其他非json字段?另外,对于eloquent、mysql(5.79)和Laravel5.6,这样的原始查询是最有效的方法吗?
感谢您提供的所有帮助/指导!:)

jaql4c8m

jaql4c8m1#

我想出来了。我的语法应该是这样的:

$users = User::whereRaw('lower(info_json->"$.full_name") like lower(?)', ["%{$user_name}%"])->where('user_type', '=', 'admin')->get();

感谢那些帮助过我们的人!就像很多语法/编码问题一样,稍微休息一下有助于我在返回时很快找到答案。

qyuhtwio

qyuhtwio2#

我觉得你应该做些

$users = User::where(DB::raw('lower(info_json->"$.full_name")', 'like', DB::raw('lower(%{$user_name}%)'))
->where('user_type', '=', 'admin')

可能我有一些sintax错误,但主要思想是使用 DB::raw 以帮助您进行查询。

相关问题