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 多对多关系属于用户的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 多对多同步与附加列

Laravel 多对多关系查询

Laravel 4:具有额外关系的多对多

Laravel 多对多中的雄辩关系通过

Laravel 中多对多关系中连接表的命名约定

Laravel:无法添加记录多对多关系