【问题标题】:Laravel Many to Many Relationship belongs to userLaravel 多对多关系属于用户
【发布时间】: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 并且该学校属于用户。

标签: php laravel eloquent many-to-many


【解决方案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'));
}

【讨论】:

    猜你喜欢
    • 2021-06-30
    • 2017-04-16
    • 2017-05-17
    • 2018-06-15
    • 2018-01-22
    • 2016-02-26
    • 2016-01-04
    • 2018-07-04
    相关资源
    最近更新 更多