【问题标题】:Laravel 8.x, 3 models and many to many relationshipLaravel 8.x,3 个模型和多对多关系
【发布时间】:2021-05-25 13:59:06
【问题描述】:

我是 laravel 的新手,正在尝试以下方法:

我有这些表:

学科:id |名字

专业:id |名字

分类:id |名字

discipline_specialty(数据透视表):id |纪律_id | specialties_id

学科模型:

public function specialties()
    {
        return $this->belongsToMany(Specialty::class);
    }

专业模特:

public function disciplines()
    {
        return $this->belongsToMany(Discipline::class);
    }

我的问题是:

如何将类别(多对多)关联到数据透视表学科专业,以便使用学科和专业 ID 访问类别名称? 我曾想过一个额外的数据透视表,它链接类别 ID 和学科专业 ID,但我不知道它是否是最好的解决方案以及如何去做。你有什么建议吗?任何帮助表示赞赏。

【问题讨论】:

  • 你能确认每个学科和专业的组合也会有一个类别吗?或者它可以保持没有类别
  • 每个学科和专业的组合总是有一个类别。

标签: laravel eloquent pivot many-to-many


【解决方案1】:

您可以引入一个 junction/pivot 模型,它将这 3 种关系关联为来自 Discipline/Speciality/Category 的多对一/belongsTo 和一对多/hasMany。

Discipline       Speciality     Category
    \\              ||             //
     \\             ||            //
      DisciplineSpecialityCategory

DisciplineSpecialityCategory 模型将具有以下属性或 FK

表:学科_专业_类别

  • discipline_id
  • speciality_id
  • category_id

现在你的模型定义会是这样的

class Discipline extends Model
{
    public function disciplineSpecialityCategory()
    {
        return $this->hasMany(DisciplineSpecialityCategory::class, 'id', 'discipline_id');
    }
}

class Speciality extends Model
{
    public function disciplineSpecialityCategory()
    {
        return $this->hasMany(DisciplineSpecialityCategory::class, 'id', 'speciality_id');
    }
}

class Category extends Model
{
    public function disciplineSpecialityCategory()
    {
        return $this->hasMany(DisciplineSpecialityCategory::class, 'id', 'category_id');
    }
}

class DisciplineSpecialityCategory extends Model
{
    public function discipline()
    {
        return $this->belongsTo(Discipline::class, 'id', 'discipline_id');
    }
    public function speciality()
    {
        return $this->belongsTo(Speciality::class, 'id', 'speciality_id');
    }
    public function category()
    {
        return $this->belongsTo(Category::class, 'id', 'category_id');
    }
}

【讨论】:

    猜你喜欢
    • 2018-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-21
    • 1970-01-01
    • 2021-07-25
    相关资源
    最近更新 更多