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

我有3个型号


学院
学生
老师


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

一所大学可以有很多老师,但一位老师只能属于一所大学。

我想在laravel中建立这些表之间的关系。
一种方法是在学生和教师表上放置一个college_id外键。但是在我的情况下,此外键很多时候都为空。因此,与其在3-4个表中没有单独的列(大多为空值),我想探索为College表建立多态关系的选项。

这是我尝试的:
laravel docs(下面的链接)中给出的示例描述了一对多关系,而我的情况更多的是一对多关系。

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

如示例中所给出的,在College表上具有collegeable_id和collegeable_type列将无法满足我的要求,因为学院可以包含许多学生/老师,因此我创建了一个数据透视表:

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 = \App\College::find(1);
$student = new \App\Student;
$student->name = 'John Doe';
$college->students()->save($student);


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

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


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

我认为这是一种期望,因为morphOne可处理表中的列。
如果我将学生模型中的morphOne函数更改为morphToMany,则代码开始工作,并且也能够检索值。但这使这种关系变得多对多,而这又不是我想要的。

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

任何帮助将非常感激。谢谢。

最佳答案

这里没有理由使用多态关系。而是,只需将一个外键添加到collegesstudents表上的teachers表中。像这样:

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风格的网站。有“客户”和“项目”,并且您想对两者都有评论。在这种情况下,您将使注释成为多态关系,因为注释属于单个客户或单个项目,但不能同时属于两者。

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

08-05 06:20