首页 > 解决方案 > 具有变量“模型”类型的 Laravel 关系组合成一个关系

问题描述

我需要以下设置:

到目前为止一切顺利,如果它会那么容易。但所谓的“模块”可能是:

并且非此即彼的模型必须按特殊顺序排列,因此可能是:

  1. Lesson如何购买收件人
  2. Lesson如何做煎饼
  3. Quiz你知道煎饼的收据吗?
  4. Lesson如何提供晚餐
  5. Lesson如何握住叉子和刀子
  6. Quiz你知道怎么吃煎饼吗?

所以我一般需要的是一种关系:

class Course {
  public function items() {
    // now there comes pseudo code
    return hasMany Lesson::class AND/OR Quiz::class -> orderBy('position')
  }
}

但是如何:grin:....我完全迷失了如何进行“创建”架构,如何检索模型等。

标签: laravelrelationship

解决方案


你需要一个多态关系。一种可以转化为课程或测验的关系。 https://laravel.com/docs/7.x/eloquent-relationships#one-to-many-polymorphic-relations

courses
   id - int
   title - string
   module_id - int 
   module_type - string

lessons
   id - int
   title - int

quiz
   id - int
   title - int

您只需要一个modules()可以像这样定义的关系调用

class Course extends Model
{
    public function modules()
    {
        return $this->morphTo();
    }
}

因此,调用 Course::find(1)->modules将为您提供课程和测验的集合。类存储在module_type字段和 id 中,module_id因此 Laravel 将知道要将记录投射到哪个类。


推荐阅读