如何在Laravel中建立3个模型之间的关系?
我知道有很多类似的问题,但我找不到更好的答案。 那么让我们开门见山吧 我有3张表格,型号如下:如何在Laravel中建立3个模型之间的关系?,laravel,eloquent,Laravel,Eloquent,我知道有很多类似的问题,但我找不到更好的答案。 那么让我们开门见山吧 我有3张表格,型号如下: //******* academic_years table************** Schema::create('academic_years', function (Blueprint $table) { $table->id(); $table->string('year')->unique(); }); //***********
//******* 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');
});
我想在这些模型之间建立多对多关系:
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在为具有空值的列编制索引时可能会出现异常行为。