带Laravel的Postgresql:带子字符串的过滤Json字段

带Laravel的Postgresql:带子字符串的过滤Json字段,laravel,postgresql,orm,Laravel,Postgresql,Orm,我有一个表,比如说post\u media,它有一个JSON列metadata。现在,metadataJSON有一个字段称为originalName,它的全名为file/media,例如:test.png。 所有类型的文件都有,比如:.png、.jpeg、.mov、.pdf、.ppt、.doc等等 我想从表中选择“仅查找png文件”。扩展没有单独的列 我使用as和mutator对虚拟列进行了尝试。但是,其中不使用虚拟列 $post_media = PostMedia::select(\DB::r

我有一个表,比如说
post\u media
,它有一个JSON列
metadata
。现在,
metadata
JSON有一个字段称为
originalName
,它的全名为file/media,例如:test.png。 所有类型的文件都有,比如:.png、.jpeg、.mov、.pdf、.ppt、.doc等等 我想从表中选择“仅查找png文件”。扩展没有单独的列

我使用
as
mutator
对虚拟列进行了尝试。但是,
其中
不使用虚拟列

$post_media = PostMedia::select(\DB::raw("metadata->>'originalName' from '\.([^\.]*)$') as file_extention"))->where('file_extention', 'png')->get();

我想要所有的PNG扩展文件。你知道吗?

你能做的就是把你的正则表达式条件放在下面的条件中

$post_media = PostMedia::select(\DB::raw("metadata->>'originalName' from '\.([^\.]*)$') as file_extention"))->whereRaw("metadata->>'originalName' from '\.([^\.]*)$')='png'")->get();

它将对您有所帮助。

您所能做的就是将regex条件设置为下面的where条件

$post_media = PostMedia::select(\DB::raw("metadata->>'originalName' from '\.([^\.]*)$') as file_extention"))->whereRaw("metadata->>'originalName' from '\.([^\.]*)$')='png'")->get();

这会对你有所帮助。

记下一些事情。如果创建虚拟列,则无法将该虚拟列置于where条件。你可以尝试拥有。@narayansharma91,而不是拥有。显示相同的错误:-
SQLSTATE[42703]:未定义列:7错误:列“文件扩展名”不存在
需要注意的几点。如果创建虚拟列,则无法将该虚拟列置于where条件。你可以尝试拥有。@narayansharma91,而不是拥有。显示相同错误:-
SQLSTATE[42703]:未定义列:7错误:列“文件扩展名”不存在