【问题标题】:Laravel through model relationshipsLaravel 通过模型关系
【发布时间】:2020-03-16 10:45:38
【问题描述】:

我有 3 张按此顺序排列的桌子:

  1. 学校it has -> id
  2. 学期it has -> school_id
  3. 学期班it has -> semester_id

现在我正在尝试在School 和SemesterClass 之间建立关系,以获取每个学校的班级列表以及每个班级的学校名称。

基于documentation 我有这样的关系:

学校模式

class School extends Model
{
    public function semesters() {
        return $this->hasMany(SchoolSemester::class);
    }

    public function classes() {
        return $this->hasManyThrough(SemesterClass::class, SchoolSemester::class);
    }
}

学期模式

class SchoolSemester extends Model
{
    public function school() {
        return $this->belongsTo(School::class);
    }

    public function classes() {
        return $this->hasMany(SemesterClass::class, 'semester_id', 'id');
    }
}

学期班模式

class SemesterClass extends Model
{
    public function school() {
        return $this->hasOneThrough(School::class, SchoolSemester::class, 'school_id', 'id');
    }

    public function semester() {
        return $this->belongsTo(SchoolSemester::class, 'semester_id', 'id');
    }
}

控制器

public function show($id)
{
    $class = SemesterClass::with(['school', 'teacher', 'teacher.user', 'students'])->findOrFail($id);
    dd($class);
    //return view('admin.Classes.show', compact('class'));
}

结果

有什么想法吗?

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    你的中间表是school_semester,laravel默认会找到foreign_key school_semester_id,但是你的foreign_key是semester_id,所以你需要在hasManyThrough中指定foreign_key:

        public function classes() {
            return $this->hasManyThrough(
                SemesterClass::class, 
                SchoolSemester::class
                'school_id', // Foreign key on school_semesters table...
                'semester_id', // Foreign key on classes table...
                'id', // Local key on schools table...
                'id' // Local key on school_semesters table...
            );
         }
    

    并像这样更改您的hasOneThrough 代码:

     public function school() {
            return $this->hasOneThrough(
                 School::class, 
                 SchoolSemester::class, 
                 'id',
                 'id',
                 'semester_id',
                 'school_id' );
        }
    

    另一种解决方案:

    因为反向只是两个 BelongsTo 关系的串联,所以你可以把 belongsTo 放在 SchoolSemester 和 School Model 中。 并得到这样的关系:

    SemesterClass::with(['semester.school'])
    

    或者您可以在 SemesterClass 模型中定义一个 mutator:

    protected $appends = ['school'];
    
    public function getSchoolAttribute() {
        return $this->semester->school;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-02
      • 2014-05-15
      • 1970-01-01
      • 2022-01-21
      • 2020-03-30
      • 1970-01-01
      • 1970-01-01
      • 2020-03-04
      相关资源
      最近更新 更多