Laravel-多对一的多态关系

Laravel-Many-to-one Polymorphic relationship

我正在使用 laravel 5.1。场景如下(此为示例,真实场景与此示例类似)

我有3个模型

  1. 大学
  2. 学生
  3. 老师

一所学院可以有很多学生,但一个学生只能属于一所学院。

一个学院可以有很多老师,但是一个老师只能属于一个学院。

我想在 laravel 中的这些 table 之间建立关系。 其中一种方法是在学生和教师 table 上放置一个 college_id 外键。但就我而言,这个外键很多时候都是空的。因此,我不想在 3-4 table 中使用主要为空值的单独列,而是想探索为 College table.

建立多态关系的选项

这是我试过的: laravel 文档(下面的 link)中给出的示例描述了一对多关系,而我的场景更像是多对一关系。

http://laravel.com/docs/5.1/eloquent-relationships#polymorphic-relations

如示例中所示,大学 table 上有 collegeable_id 和 collegeable_type 列不会满足我的要求,因为大学可以包含很多 students/teachers 所以我创建了一个枢轴 table:

Schema::create('collegeables', function (Blueprint $table) {
        $table->integer('college_id')->unsigned();
        $table->integer('collegeable_id')->unsigned();
        $table->string('collegeable_type');
    });

我有以下型号

大学模型:

    namespace App;

use Illuminate\Database\Eloquent\Model;

class College extends Model
{
    public function students()
    {
        return $this->morphedByMany('App\Student', 'collegeable');
    }
}

学生模型:

    namespace App;

use Illuminate\Database\Eloquent\Model;

class Student extends Model
{
    public function college()
    {
        return $this->morphOne('App\Colleges', 'collegeable');
    }
}

通过这种安排,我可以像这样使用 College 模型实例存储学生

$college = \App\College::find(1);
$student = new \App\Student;
$student->name = 'John Doe';
$college->students()->save($student);

但是当我尝试使用下面指定的学生模型实例检索大学模型实例时,它给了我一个错误:-

public function index()
    {
        return \App\Student::find(1)->college;
    }

SQLSTATE[42S22]:未找到列:1054 未知列'colleges.collegeable_id'

这是一种预期,因为我想 morphOne 与 table 中的列一起工作。 如果我将 Student Model 中的 morphOne 函数更改为 morphToMany,代码将开始工作并且我也能够检索值。但这使这种关系成为多对多关系,这又不是我想要的。

所以我的问题是:- 我可以在学生模型中使用它们的 morphSomething 函数来检索学生大学的值,同时保持一对多关系吗?

任何帮助将不胜感激。谢谢。

这里没有理由使用多态关系。相反,只需在 studentsteachers table 上向 colleges table 添加一个外键。像这样:

colleges
    id
    name

teachers
    id
    name
    college_id

students
    id
    name
    college_id

然后您的模型可以使用 belongsTo()hasMany() 关系,如下所示:

class College extends Model {
    public function students() {
        return $this->hasMany(App\Student::class);
    }

    public function teachers() {
        return $this->hasMany(App\Teacher::class);
    }
}

class Teacher extends Model {
    public function colleges() {
        return $this->belongsTo(App\College::class);
    }
}

class Student extends Model {
    public function colleges() {
        return $this->belongsTo(App\College::class);
    }
}

多态一对多关系与此关系相反,您的模型只能与单个记录相关,但该记录可以是许多不同的模型。

编辑:为了进一步解释为什么这里不需要多态关系,让我们看一下需要它的地方。假设您有一个简单的 CRM 样式网站。有客户和项目,您希望对两者都有评论。在这种情况下,您可以使 Comments 成为多态关系,因为 Comments 属于单个客户或单个项目,但不能同时属于两者。

你们的关系恰恰相反。在您的情况下,学生和教师属于一所大学。如果您遵循前面示例的模式,一所大学将属于一个学生或老师。