如何在Laravel中建立3个模型之间的关系?

如何在Laravel中建立3个模型之间的关系?,laravel,eloquent,Laravel,Eloquent,我知道有很多类似的问题,但我找不到更好的答案。 那么让我们开门见山吧 我有3张表格,型号如下: //******* academic_years table************** Schema::create('academic_years', function (Blueprint $table) { $table->id(); $table->string('year')->unique(); }); //***********

我知道有很多类似的问题,但我找不到更好的答案。 那么让我们开门见山吧

我有3张表格,型号如下:

//******* academic_years table**************
Schema::create('academic_years', function (Blueprint $table) {
        $table->id();
        $table->string('year')->unique();
    });
//************classrooms table*************
Schema::create('classrooms', function (Blueprint $table) {
        $table->id();
        $table->string('name')->unique();
        $table->string('slug');
    });
//**********faculties table***************
Schema::create('faculties', function (Blueprint $table) {
      $table->id();
      $table->string('name')->unique();
      $table->string('slug');
    });
我想在这些模型之间建立多对多关系:

  • 一个学年(2020年)有许多教室
  • 该年(2020年)的每个教室可以有多个教员
  • 一个教员可以属于许多教室
  • 我想建立一种关系,允许返回所有年份的列表,以及属于每个教室的教室和教员

    例如:我想回到2020年,教室:1年级和1年级,2年级和1年级

    AcademicYear::with('classroom.faculty')
      ->whereHas('classroom', function($query) {
        $query->whereIn('name', ['Grad-1', 'Grad-2']);
          ->whereHas('faculty', function($query) {
            $query->where('name', 'faculty-1');
          });
      })
      ->where('year', 2020);
    
    MyPivotModel::with([
        'academic_year', 
        'classroom', 
        'faculty'
      ])
      ->whereHas('classroom', function($query) {
        $query->whereIn('name', ['Grad-1', 'Grad-2']); 
      })
      ->whereHas('faculty', function($query) {
        $query->where('name', 'faculty-1');
      })
      ->whereHas('academic_year', function($query) {
        $query->where('year', 2020);
      });
    
    我的透视表看起来像这样。或者有人可以建议一个更好的方法


    我建议在教室和教员桌上增加外键

    之后,您需要在每个模型之间分配add关系,belongToMany()和hasMany()

    定义后,您可以使用
    with()
    whereHas
    获取相关数据

    要获取您将使用的所有教室和学院:

    AcademicYear::with('classroom.faculty')
      ->where('year', 2020);
    
    我想回到2020年,带教室:1年级带教员1,2年级带教员1

    AcademicYear::with('classroom.faculty')
      ->whereHas('classroom', function($query) {
        $query->whereIn('name', ['Grad-1', 'Grad-2']);
          ->whereHas('faculty', function($query) {
            $query->where('name', 'faculty-1');
          });
      })
      ->where('year', 2020);
    
    MyPivotModel::with([
        'academic_year', 
        'classroom', 
        'faculty'
      ])
      ->whereHas('classroom', function($query) {
        $query->whereIn('name', ['Grad-1', 'Grad-2']); 
      })
      ->whereHas('faculty', function($query) {
        $query->where('name', 'faculty-1');
      })
      ->whereHas('academic_year', function($query) {
        $query->where('year', 2020);
      });
    
    您还应该能够执行以下操作(不确定查询将如何查找):

    参考-

    而且。。。如果要坚持使用相同的结构,可以通过透视表定义相同的关系


    更新:

    您可以做的另一件事是为Pivot表添加一个模型,并定义Pivot和其他模型之间的关系

    我想回到2020年,带教室:1年级带教员1,2年级带教员1

    AcademicYear::with('classroom.faculty')
      ->whereHas('classroom', function($query) {
        $query->whereIn('name', ['Grad-1', 'Grad-2']);
          ->whereHas('faculty', function($query) {
            $query->where('name', 'faculty-1');
          });
      })
      ->where('year', 2020);
    
    MyPivotModel::with([
        'academic_year', 
        'classroom', 
        'faculty'
      ])
      ->whereHas('classroom', function($query) {
        $query->whereIn('name', ['Grad-1', 'Grad-2']); 
      })
      ->whereHas('faculty', function($query) {
        $query->where('name', 'faculty-1');
      })
      ->whereHas('academic_year', function($query) {
        $query->where('year', 2020);
      });
    

    我一路上就弄明白了。也许这不是最好的方法,但我至少带我去了某个地方。如果有人有更好的方法,或者这种方法存在一些问题,请随时在这里分享

    我按如下方式设置关系:

    //*********ACADEMICYEAR MODEL *************
    
    public function classrooms()
    {
      return $this->belongsToMany('App\Model\Setting\Classroom', 'academic_year_classroom);
    }
    
    
    //***********FACULTY MODEL ********************** //
    public function classrooms()
    {
      return $this->belongsToMany('App\Model\Setting\Classroom', 'academic_year_classroom');
    }
    
    
    //********CLASSROOM MODEL **************
    public function academicyears()
    {
      return $this->belongsToMany('App\Model\Setting\AcademicYear');
    }
    
    public function faculties()
    {
      return $this->belongsToMany('App\Model\Setting\Faculty', 'academic_year_classroom', 'classroom_id', 'faculty_id');
    }
    
    我还能够返回每年有教室的所有年份的列表,以及分配给每个教室的教员,如下所示:

    //*********ACADEMICYEAR MODEL *************
    
    public function classrooms()
    {
      return $this->belongsToMany('App\Model\Setting\Classroom', 'academic_year_classroom);
    }
    
    
    //***********FACULTY MODEL ********************** //
    public function classrooms()
    {
      return $this->belongsToMany('App\Model\Setting\Classroom', 'academic_year_classroom');
    }
    
    
    //********CLASSROOM MODEL **************
    public function academicyears()
    {
      return $this->belongsToMany('App\Model\Setting\AcademicYear');
    }
    
    public function faculties()
    {
      return $this->belongsToMany('App\Model\Setting\Faculty', 'academic_year_classroom', 'classroom_id', 'faculty_id');
    }
    

    同样,如果你有更好的方法,请与我们分享。如果这个答案有帮助,请投票表决,这样它可以帮助其他人。谢谢。

    非常感谢您的回复。我可以在教室和教员表上添加外键,但我不想这样做的原因是教室将被分配到多个学年,教员也是如此。我想保留所有学年的记录。如果我有这些表的外键,这意味着如果我有faculties表中的教室id外键,它将引用单个教室,与教室表相同。我想让一个教师分配到多个教室,每个教室分配到不同的年份好的,酷。另一种方法是使用manytomy。这样,您就可以使用Laravel附带的sync()和attach()/detach()方法。需要注意的一点是,MySQL在为具有空值的列编制索引时可能会出现异常行为。