如何在Laravel中组合多个Eloquent集合

时间:2016-07-22 10:54:32

标签: php laravel laravel-5 eloquent

我想将各种模型组合成一个模型(用于输出到DataTables实例中)。

到目前为止,我已经做到了这一点(实际上大约有15个型号,我只是在这里展示了两个):

$all_records = new Collection;

$care_plan_updates = \App\CarePlanUpdate::where('resident_id', $resident->id)->where('closed','0')->get();
if($care_plan_updates) $all_records = $all_records->merge($care_plan_updates);  

$medication_errors = \App\MedicationError::where('resident_id', $resident->id)->where('closed','0')->get();
if($medication_errors) $all_records = $all_records->merge($medication_errors);

return Datatables::of($all_records)

在第一印象中,这似乎完成了诀窍。但是,我注意到merge方法组合了共享ID值的记录。因此,例如,ID为12的CarePlanUpdate被ID为12的MedicationError记录覆盖。

我试过'忘记'ID列,但这似乎没有任何影响:

if($care_plan_updates) $all_records = $all_records->merge($care_plan_updates->forget('id'));

理想情况下,我想要一种简单地组合两个集合而不会将行与重复值合并的方法。我是Eloquent的新手 - 所以对我出错的地方的任何指导都会非常感激!

1 个答案:

答案 0 :(得分:3)

我找到了解决方案。我不确定这是实现我的目标的最优雅的方式,但它确实有这个诀窍:

我决定循环浏览每个单独的集合,并使用merge将每条记录添加到我的主集合中,而不是使用push集合方法。像这样:

$all_records = new Collection;

$care_plan_updates = \App\CarePlanUpdate::where('resident_id', $resident->id)->where('closed','0')->get();  
foreach($care_plan_updates as $care_plan_update) {
    $all_records->push($care_plan_update);
}   

$risk_assessment_updates = \App\RiskAssessmentUpdate::where('resident_id', $resident->id)->where('closed','0')->get();
foreach($risk_assessment_updates as $risk_assessment_update) {
    $all_records->push($risk_assessment_update);
}