Laravel 多对多关系属于用户
Posted
技术标签:
【中文标题】Laravel 多对多关系属于用户【英文标题】:Laravel Many to Many Relationship belongs to user 【发布时间】:2022-01-23 23:31:25 【问题描述】:我需要调用属于当前登录用户的课程,我的模型结构如下
用户有一所学校:
public function school()
return $this->hasOne(School::class);
学校有很多校区
public function campuses()
return $this->hasMany(Campus::class);
校区属于许多课程:
public function school()
return $this->belongsTo(School::class);
public function courses()
return $this->belongsToMany(Course::class , 'campus_course');
课程属于许多校区:
public function campuses()
return $this->belongsToMany(Campus::class , 'campus_course');
我试图像这样调用 CourseController 但它重复数据
课程控制器:
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
$modules = array();
foreach(auth()->user()->school->campuses as $item)
foreach($item->programs as $program)
array_push($modules , $program);
return view('programs.index' , compact('modules'));
提前致谢。
【问题讨论】:
它正在通过所有校园的所有程序。如果所有校区都存在一个程序,那么您将有重复项。之后您可能需要使用array_unique
之类的东西来删除任何重复项。
我怎样才能以更好的方式做到这一点?无需查询整个数据库
"属于当前登录用户的课程" 但是课程和用户之间没有关系。您只是获得用户学校所有校区的所有课程。您是指用户可以使用的课程吗?用户应该附属于校园吗?
您当前的代码也可能只是$modules = auth()->user()->school->campuses->programs->toArray();
嗨 @miken32 是的,校园有 school_id 并且该学校属于用户。
【参考方案1】:
这种关系链非常丑陋。我无法尝试复制您的设置,因此无法确定,但我认为您最好的选择可能是这样的:
public function index()
$campus_ids = Auth::user()->school->campuses()->pluck('id');
$modules = Program::distinct()
->whereHas('campuses', fn ($q) => $q->whereIn('id', $campus_ids))
->get()
->toArray();
return view('programs.index' , compact('modules'));
【讨论】:
以上是关于Laravel 多对多关系属于用户的主要内容,如果未能解决你的问题,请参考以下文章