Laravel中如何更高效地将指定数据库行赋值为独立变量?
更优的Laravel数据获取与变量赋值方法
你当前的写法会发起4次独立的数据库查询,效率较低。可以通过以下几种更优的方式,仅用1次查询完成数据获取并分配到对应变量:
方法一:集合解构赋值
利用findOrFail接收数组参数的特性,一次性获取所有记录,再通过PHP的数组/集合解构直接赋值:
// 单次查询获取指定ID的所有记录,返回按传入ID顺序排列的集合 $policies = GlobalVariable::findOrFail([1, 2, 3, 4]); // 解构集合到对应变量,顺序与ID数组一致 [$policy1, $policy2, $policy3, $policy4] = $policies;
注意:如果数据库返回的记录顺序和传入的ID顺序不一致,可以在查询时加上排序确保顺序:
$policies = GlobalVariable::whereIn('id', [1,2,3,4]) ->orderByRaw('FIELD(id, ?, ?, ?, ?)', [1,2,3,4]) ->get(); [$policy1, $policy2, $policy3, $policy4] = $policies;
方法二:按ID映射后取值
通过集合的keyBy方法将记录按ID作为键名映射,之后直接通过ID获取对应模型,无需担心顺序问题:
// 单次查询并按ID建立映射 $policyMap = GlobalVariable::findOrFail([1, 2, 3, 4])->keyBy('id'); // 直接通过ID取出对应模型 $policy1 = $policyMap[1]; $policy2 = $policyMap[2]; $policy3 = $policyMap[3]; $policy4 = $policyMap[4];
方法三:关联数组解构(PHP 7.1+)
结合keyBy和关联数组解构,可以更直观地完成变量赋值:
$policyMap = GlobalVariable::findOrFail([1,2,3,4])->keyBy('id'); // 直接解构映射集合到对应变量 ['1' => $policy1, '2' => $policy2, '3' => $policy3, '4' => $policy4] = $policyMap;
以上方法均只发起1次数据库查询,大幅提升性能的同时,代码也更简洁易维护。
内容的提问来源于stack exchange,提问作者php_dev
相关产品推荐
相关产品推荐

