Laravel多对多关系
嗨,我被困在试图按周从数据库中获取数据。
我有一张桌子(多对多关系)
关系
常规
public function exercises() {
return $this->belongsToMany(Exercise::class)->withPivot('week', 'day', 'completed')->orderBy('week','asc');;
}
行使
public function routines() {
return $this->belongsToMany(Routine::class)->withPivot('week', 'day', 'completed');
}
我想像这样每周获取所有行。
Json example:
{
"week": [
1: {
"exercises": [
{
"name": "Abs"
}
]
},
2: {
...
}
]
}
我已经尝试过了
if(!empty($routine)) {
foreach ($routine->exercises as $exercise) {
$week = $exercise->pivot->week;
if($week == $previous_week) {
array_push($this->weeks, $exercise->pivot->week);
} else {
array_push($this->weeks, [
$exercise->pivot->week => $exercise->pivot->week
]);
}
$previous_week = $exercise->pivot->week;
}
// dd($this->weeks);
// return DB::table('exercise_routine')->where('routine_id',$routine->id)->max('week');
}
说明
exercise_routine表中有一个星期编号,用于按周分隔锻炼。我需要创建一个数组,如果week是1,则将数组推入1,如果下一个是1,则将数组推入同一数组。如果下一个是2或不同,则按2。
我不确定您是否能理解我的意思,它只是在努力寻找实现的方法。
提前谢谢了。
使用收集方法mapToGroups可以帮助您简化对的分组exercises
。
这是一个有关如何在您的情况下使用的示例:
if(!empty($routine)){
// creating groups of exercise by week [1 => ['abs'], 2 => []]
$exerciseWeeks = $routine->exercises->mapToGroups(function($exercise, $k){
return [$exercise->pivot->weeks => $exercise->name];
})
->map(function($exerciseInWeek, $k){ // creating your json format from here point on
$weekObj = new \stdClass;
$weekObj->exercises = [];
foreach($exerciseInWeek as $exerciseName){
$exerciseObj = new \stdClass;
$exerciseObj->name = $exerciseName;
$weekObj->exercises[] = $exerciseObj;
}
return $weekObj;
});
// creates the final json object
$routineObj = new \stdClass;
$routineObj->week = $exerciseWeeks->all();
$finalRoutineJSON = json_encode($routineObj);
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句