【问题标题】:How to make a 'one OF many relationships' relationship in MySQL/Laravel如何在 MySQL/Laravel 中建立“多个关系之一”关系
【发布时间】:2020-08-28 21:49:28
【问题描述】:

在我进入这个问题之前,我并不是在问一对多的关系。

我有一个名为enrollments 的表,注册可以是lecturetestaptitudeenrollments 表与lectures 表、tests 表和aptitudes 表具有一对多关系。

我的问题是:我怎样才能使注册只允许链接到这三个表中的一个?目前,数据库允许注册既是讲座又是测试,这是不可能的。

问题的可视化表示:

我用谷歌搜索了好几个小时,但找不到有类似问题的人,请帮忙。提前致谢。

【问题讨论】:

  • 这种问题可能是架构设计缺陷的症状
  • 如果注册只是这三个中的一个,那么其他两个关系将为空,您不必担心。

标签: php mysql database laravel relationship


【解决方案1】:

由于注册只是三者之一,其他2个关系将是空的,你不必担心它们。

假设一个学生正在报名参加讲座,那么表格行的 test_id 和 aptitude_id 将具有 NULL 值,因此这些关系将是空的。

【讨论】:

    【解决方案2】:

    由于您使用的是 laravel,现在似乎是尝试使用多对一 polymorphic relationship 的好时机。

    因此,您的 enrollments 表将有一个名为 enrollable 的关系,它可以指向 3 个表中的任何一个。注意:名称 enrollable 只是遵循 laravel 的示例命名约定。

    要实现这种关系,您需要首先创建迁移,在这里您可以使用方便的morphs 方法,就像这样

    // 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');
    }
    

    正确设置后,您可以像使用标准的一对多关系一样使用这种新关系。例如$lecture->enrollments 以获取所有注册的讲座。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-18
      • 2017-07-09
      • 1970-01-01
      相关资源
      最近更新 更多