簡體   English   中英

通過 Laravel 中的數據透視表與第三個模型的關系

[英]Relationship to a third model through a pivot table in Laravel

我是 Laravel 的初學者,我正在使用以下模式:

Course {
  id,
  name,
  teacher_id
}

Category {
  id,
  name
}

Teacher {
  id,
  name
}

CategoryCourses {
  id,
  course_id,
  category_id
}

如您所見,CategoryCourses 是我的數據透視表,我在 Courses 和 Category 之間使用belongsToMany

現在——我想做什么? 我正在嘗試為類別創建一個show視圖,在其中單擊類別,它應該顯示具有該類別的所有課程以及教授該課程的教師。

例如 - 如果我有 4 門 Laravel 課程,其中包含“Web 開發”類別 - 我想將所有課程顯示在一張卡片上,並在每個課程中顯示老師的姓名。

以下是我的模型:

類別

class Category extends Model
{
    use HasFactory;

    protected $fillable = [
        'name'
    ];

    public function courses()
    {
        return $this->belongsToMany(Course::class, 'course_categories', 'course_id', 'category_id');
    }

    public function teacher()
    {
        return $this->hasOneThrough(Teacher::class, CourseCategory::class);
    }
    
}

課程

    class Course extends Model
{
    use HasFactory;

    protected $fillable = [
        'name','description','cover','difficulty', 'teacher_id'
    ];

    public function teachers() {
        return $this->belongsTo(Teacher::class, 'teacher_id', 'id');
    }

    public function categories() {
        return $this->belongsToMany(Category::class, 'course_categories');
    }
}

老師

class Teacher extends Authenticatable
{
    use HasFactory;

    protected $fillable = [
        'name','email','password', 'avatar'
    ];

   public function courses() {
       return $this->hasMany('Course', 'teacher_id');
   }

}

類別控制器 - 顯示($id)

public function show($id)
    {
        $category = Category::findOrFail($id)->first();

        
        $course = Category::with('courses','teacher')->get();
        return view('admin.showcoursesbycategory', compact('category', 'course'));
    }

這是我在編寫$course = Category::with('teacher')代碼后遇到的錯誤:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'teachers.course_category_id' in 'on clause' (SQL: select `teachers`.*, `course_categories`.`category_id` as `laravel_through_key` from `teachers` inner join `course_categories` on `course_categories`.`id` = `teachers`.`course_category_id` where `course_categories`.`category_id` in (1, 2, 3, 4))

我如何實現我想要做的事情? 我究竟做錯了什么? 請在這里幫助我。

假設每門課程只有一位老師,按照正常的命名約定,關系應該在Course模型上命名為teacher

class Course extends Model
{
    use HasFactory;

    protected $fillable = [
        'name','description','cover','difficulty', 'teacher_id'
    ];

    public function teacher() {
        return $this->belongsTo(Teacher::class, 'teacher_id', 'id');
    }

    public function categories() {
        return $this->belongsToMany(Category::class, 'course_categories', 'course_id', 'category_id');
    }
}

我想您需要修復Category模型中的關系簽名

class Category extends Model
{
    use HasFactory;

    protected $fillable = [
        'name'
    ];

    public function courses()
    {
        /**
         * Change
         * return $this->belongsToMany(Course::class, 'course_categories', 'course_id', 'category_id');
         */
        return $this->belongsToMany(Course::class, 'course_categories', 'category_id', 'course_id');
    }

    public function teacher()
    {
        return $this->hasOneThrough(Teacher::class, CourseCategory::class);
    }
    
}

然后在控制器中,您可以將查詢編寫為

public function show($id)
{
    $category = Category::with('courses.teacher')->findOrFail($id);


    return view('admin.showcoursesbycategory', compact('category'));
}

然后在視圖中你可以

<h1>{{ $category->name }}</h1>

<p>======== Courses ========</p>

@foreach($category->courses as $course)
    <p>{{ $course->name }}</p>
    <p>Conducted By: {{ $course->teacher->name }}</p>
@endforeach

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM