Php 如何制作';众多关系之一';MySQL/Laravel中的关系
在我进入这个问题之前,我不是在问一对多的关系 我有一个名为Php 如何制作';众多关系之一';MySQL/Laravel中的关系,php,mysql,database,laravel,relationship,Php,Mysql,Database,Laravel,Relationship,在我进入这个问题之前,我不是在问一对多的关系 我有一个名为注册的表,注册可以是讲座,测试,或能力。表注册人数与讲座表、测试表和能力表有一对多关系 我的问题是:如何使注册只允许链接到这三个表中的一个?目前,数据库允许注册既可以是讲座,也可以是考试,这是不可能的 问题的可视化表示: 我在谷歌上搜索了好几个小时,但找不到有类似问题的人,请帮忙。提前感谢。因为注册只是三种关系中的一种,所以其他两种关系将是空的,您不必担心它们 假设一个学生报名参加一个讲座,那么表行的test\u id和aptitude
注册
的表,注册可以是讲座
,测试
,或能力
。表注册人数
与讲座
表、测试
表和能力
表有一对多关系
我的问题是:如何使注册只允许链接到这三个表中的一个?目前,数据库允许注册既可以是讲座,也可以是考试,这是不可能的
问题的可视化表示:
我在谷歌上搜索了好几个小时,但找不到有类似问题的人,请帮忙。提前感谢。因为注册只是三种关系中的一种,所以其他两种关系将是空的,您不必担心它们
假设一个学生报名参加一个讲座,那么表行的test\u id和aptitude\u id的值将为
NULL
,因此这些关系将是空的。由于您使用的是laravel,现在似乎是尝试使用多对一的好时机
因此,您的注册
表将具有一个名为可注册
的关系,该关系可以指向这三个表中的任何一个。注意:名称可注册
仅遵循laravel的示例命名约定
要实现这种关系,首先需要创建迁移,在迁移中可以使用如下方便的方法
// This will make 2 columns called 'enrollable_type' (VARCHAR) and 'enrollable_id' (UNSIGNED BIGINT)
Schema::table('enrollments', function (Blueprint $table) {
...
$table->morphs('enrollable');
});
然后,您只需在模型中设置关系
// In the Enrollment model you define the enrollable relationship which will be either of 3 model
public function enrollable()
{
return $this->morphTo('enrollable','enrollable_type','enrollable_id');
}
// in your 3 models you can specify the opposite relationship to refer back to the enrollment
public function enrollments()
{
return $this->morphMany('App\Enrollment', 'enrollable', 'enrollable_type', 'enrollable_id');
}
正确设置后,您可以使用此新关系,如标准的一对多关系。例如
$touch->registrations
,以获得一次讲座的所有注册。这种问题可能是有缺陷的模式设计的症状。如果注册仅为三个关系中的一个,那么其他两个关系将为空,您不必担心它们。