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
相关产品推荐
相关产品推荐

