Laravel 5.5中如何更优地从函数返回两个模型并在新函数中调用?
嘿,我来给你几个更优雅的方案,比直接返回索引数组好用多了,后续访问的时候也更清晰直观:
推荐方案1:返回带明确键名的关联数组(最常用)
直接给每个结果起一个语义化的键名,后续调用时不用记索引位置,可读性拉满:
public function getDetails($id) { // 注意:first()返回单个模型,变量名改成单数更贴合语义 $instrument = Instruments::join('revisions', 'revisions.id', '=', 'instruments.revisions_id') ->orderBy('instruments.name') ->first(); // get()返回模型集合,变量名用复数更合理 $teams = Team::join('instruments', 'teams.instruments_id', '=', 'instruments.id') ->orderBy('instruments.name') ->get(); // 用关联数组返回,键名清晰对应结果 return [ 'instrument' => $instrument, 'teams' => $teams ]; }
在其他函数里调用访问的示例:
$details = $this->getDetails($yourId); // 直接通过键名获取,不用猜索引 $targetInstrument = $details['instrument']; $allTeams = $details['teams'];
推荐方案2:使用Laravel集合(适合后续做集合操作)
如果后续你需要对返回的结果做过滤、排序等Laravel集合专属操作,可以把它们包装成Collection对象:
use Illuminate\Support\Collection; public function getDetails($id) { $instrument = Instruments::join('revisions', 'revisions.id', '=', 'instruments.revisions_id') ->orderBy('instruments.name') ->first(); $teams = Team::join('instruments', 'teams.instruments_id', '=', 'instruments.id') ->orderBy('instruments.name') ->get(); return new Collection([ 'instrument' => $instrument, 'teams' => $teams ]); }
调用访问示例:
$details = $this->getDetails($yourId); // 用集合的get方法获取 $targetInstrument = $details->get('instrument'); $allTeams = $details->get('teams'); // 还能直接用集合的便捷方法,比如判断结果是否存在 if ($details->has('instrument')) { // 执行相关逻辑 }
简洁写法:使用compact函数
如果你的变量名和想要的键名完全一致,可以用compact快速生成关联数组,代码更简洁:
public function getDetails($id) { $instrument = Instruments::join('revisions', 'revisions.id', '=', 'instruments.revisions_id') ->orderBy('instruments.name') ->first(); $teams = Team::join('instruments', 'teams.instruments_id', '=', 'instruments.id') ->orderBy('instruments.name') ->get(); // compact会自动根据变量名生成对应键名的数组 return compact('instrument', 'teams'); }
访问方式和方案1完全一致,非常省心~
内容的提问来源于stack exchange,提问作者Carol.Kar
相关产品推荐
相关产品推荐

