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

Laravel 5.4无需array_push获取数据及代码优化方案咨询

优化Laravel 5.4中获取审批人请假记录的代码

嘿,很高兴帮你优化这段代码!你的需求是去掉array_push同时提升代码效率,Laravel确实提供了更简洁高效的方式来实现这个逻辑,我分两种方案给你说明:

方案1:用pluck替代循环与array_push

原来的代码里,你先查询到审批人列表,再通过foreach+array_push提取user_id数组——其实Laravel的集合自带pluck方法,可以一步到位拿到你需要的字段集合,完全不用手动循环:

// 直接获取审批人的user_id集合(或数组)
$approverIds = DB::table('users')
    ->leftjoin('approver_group_list', 'approver_group_list.user_id', '=', 'users.id')
    ->leftjoin('approval_roles', 'approval_roles.as_id', '=', 'approver_group_list.as_id')
    ->leftjoin('approver_requestor_list', 'approver_requestor_list.at_id', '=', 'approval_roles.at_id')
    ->where('approver_requestor_list.user_id', 512)
    ->pluck('users.id'); // 这里直接提取user_id字段,返回Collection对象

// 直接用集合查询LeaveMain,Laravel会自动处理集合转数组
$leave_list = LeaveMain::whereIn('requestor_id', $approverIds)->get();

如果确实需要数组,只需要在pluck后面加->toArray()即可:$approverIds = ...->pluck('users.id')->toArray();。这个方案比原来的代码简洁很多,省去了手动循环的步骤。

方案2:用子查询减少数据库请求次数

上面的方案还是会发起两次数据库查询(一次查审批人ID,一次查请假记录),我们可以把这两个查询合并成一次子查询,进一步提升性能:

$leave_list = LeaveMain::whereIn('requestor_id', function ($query) {
    $query->select('users.id')
          ->from('users')
          ->leftjoin('approver_group_list', 'approver_group_list.user_id', '=', 'users.id')
          ->leftjoin('approval_roles', 'approval_roles.as_id', '=', 'approver_group_list.as_id')
          ->leftjoin('approver_requestor_list', 'approver_requestor_list.at_id', '=', 'approval_roles.at_id')
          ->where('approver_requestor_list.user_id', 512);
})->get();

这个方案只需要一次数据库请求,Laravel会自动把内部的查询作为子查询嵌入到主查询中,执行效率更高,尤其在数据量较大的时候优势更明显。

额外小提示

如果你的模型之间已经定义了关联关系(比如User和LeaveMain,或者审批相关的模型关联),还可以用关联查询来实现,代码会更符合Laravel的Eloquent风格,但如果没有定义关联的话,上面的两种方案已经足够简洁高效了。

内容的提问来源于stack exchange,提问作者No Name

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:08:15