Laravel 7如何将Eloquent返回的字符串转为整数数组?
解决Laravel中whereIn使用逗号分隔字符串ID的问题
嗨,我明白你的问题了——你现在拿到的是一个包含逗号分隔ID的字符串,直接传给whereIn会导致Laravel把整个字符串当作单个查询条件,生成的SQL自然就不对了。这里有两种靠谱的解决办法:
方法一:拆分字符串并转换为整数数组
这是最推荐的方案,性能更好也更符合Laravel的使用习惯:
- 先取出那个逗号分隔的字符串(因为你的pluck返回的是只包含一个元素的集合,所以用
first()直接拿到字符串) - 把字符串按逗号拆分,再把每个元素转成整数
代码示例:
// 拿到逗号分隔的ID字符串 $pai_id_str = MenuRoles::where('role_id', 1)->pluck('pai_id')->first(); // 拆分并转为整数数组 $ids = array_map('intval', explode(',', $pai_id_str)); // 正常执行查询 $menus = \App\Menu::whereIn('id', $ids) ->with('submenus') ->where('active', 1) ->orderBy('position') ->get();
这样生成的SQL就会变成where id in (15,19),完全符合你的需求。
方法二:使用SQL的FIND_IN_SET函数(不推荐大数据量场景)
如果因为某些原因不想处理数组,也可以直接用SQL的原生函数来匹配逗号分隔的ID,但要注意这个方法无法利用id字段的索引,数据量大的时候查询会变慢:
$pai_id_str = MenuRoles::where('role_id', 1)->pluck('pai_id')->first(); $menus = \App\Menu::whereRaw("FIND_IN_SET(id, ?)", [$pai_id_str]) ->with('submenus') ->where('active', 1) ->orderBy('position') ->get();
为什么原来的写法不行?
你之前用pluck('pai_id')得到的是一个Illuminate\Support\Collection,里面的元素是字符串"15,19"。当你把这个集合传给whereIn时,Laravel会把集合里的每个元素当作独立的查询值,所以就生成了where id in ('15,19')——相当于只查询id等于字符串"15,19"的记录,这显然不是你想要的。
内容的提问来源于stack exchange,提问作者SaroBeatbox
相关产品推荐
相关产品推荐

