You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 7如何将Eloquent返回的字符串转为整数数组?

解决Laravel中whereIn使用逗号分隔字符串ID的问题

嗨,我明白你的问题了——你现在拿到的是一个包含逗号分隔ID的字符串,直接传给whereIn会导致Laravel把整个字符串当作单个查询条件,生成的SQL自然就不对了。这里有两种靠谱的解决办法:

方法一:拆分字符串并转换为整数数组

这是最推荐的方案,性能更好也更符合Laravel的使用习惯:

  1. 先取出那个逗号分隔的字符串(因为你的pluck返回的是只包含一个元素的集合,所以用first()直接拿到字符串)
  2. 把字符串按逗号拆分,再把每个元素转成整数

代码示例:

// 拿到逗号分隔的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 22:52:34