【问题标题】:Laravel, Database design for multiple model in one rowLaravel,一行中多个模型的数据库设计
【发布时间】:2018-10-14 17:23:02
【问题描述】:

我正在构建一个显示模块列表的应用程序,例如 Udemy。下面是我想要实现的简化示例。

(这不是数据库表,这是界面说明)

No   Module name               Type
1    Introduction               Video
2    What is Composer?          Video
3    Model View Controller      Video
4    Blade Templating Engine    Video
5    Quiz - First Quiz          Quiz

如您所见,这是您通常会在 Udemy 或 Lynda 等在线教育网站上看到的内容。

显示模块列表,每个模块可以是视频模块或测验模块。

视频模块在数据库中有一个视频 URL 列。而测验模块与视频模块完全不同。它会有问题和答案。

我们可以对 CMS 中的模块进行排序,因此,每个模块在数据库中都会有一个排序列。

问题是:

我们如何在数据库中建模模块 -> 视频、模块 -> 测验?我必须建立什么样的表关系?

【问题讨论】:

  • @RossWilson 嗨,罗斯,感谢您的回复。使用多态关系,我们如何解决Module -> { Video, Quiz } 关系?根据 Laravel 文档,我认为文档上的 comments 在我的情况下是 modules。对吗?
  • 阅读 Laravel 文档后,文档中的多态关系与我的示例不同。在 Laravel 文档中,Video 可以有多个 cmets,Post 也可以有多个 cmets。但是Comment 不是VideoComment 也不是Post。这是不同的,因为在我的例子中,Video 是一个 ModuleQuiz 也是一个模块。

标签: php database laravel database-design


【解决方案1】:

可以参考 Laravel Eloquent 关系:link

通过使用它,您将需要三个表格:模块、测验和视频

【讨论】:

    【解决方案2】:

    您想要做的是,拥有一个 db 对象/模型来表示测验和视频,因为根据您的解释,它们将被视为相同的东西,即它们都是模块。唯一的区别在于类型。这意味着您需要 DB 表中的“类型”列,以指示每个模块的类型。您还需要一个 URL 列,它应该是(可为空的),即可选的,因为只有当模块是视频类型时才需要它,正如您所解释的。 关于有问题和答案,这需要一个相关的模型,因为问题/答案可能需要存储自己的数据(例如 created_at 等) 因此,我会说您可能需要一个问题模型(数据库对象)以及一个答案模型。这些模型中的每一个都有一个 module_id 列,以将它们链接到它们所属的模块。你雄辩的模型关系应该是这样的

    <!--module model-->
    <?php
    
    namespace App;
    
    use Illuminate\Database\Eloquent\Model;
    
    
    class Module extends Model
    {
      
      public function questions(){
        return $this->hasMany('App\Question');
      }
      
      public function answers(){
        return $this->hasMany('App\Answer');
      }
    
      
      
    }
    
    
    
    <!--Question model-->
    
    <?php
    
    namespace App;
    
    use Illuminate\Database\Eloquent\Model;
    
    
    class Question extends Model
    {
      
      public function module(){
        return $this->belongsTo('App\Module');
      }
      
      
    }
    
    
    
    <!-- Answer Model -->
    
    <?php
    
    namespace App;
    
    use Illuminate\Database\Eloquent\Model;
    
    
    class Answer extends Model
    {
      
      public function module(){
        return $this->belongsTo('App\Module');
      }
      
      
    }

    话虽如此,但我认为这不是解决此问题的最佳方法。如果你想做的是,有一门课程,它有几个模块,而且也可能有一个或多个测验,那么你真正应该做的是将模块模型和测验模型联系起来,直接到课程模型。 因此,课程与模块之间存在一对多关系,与测验之间存在一对多关系。这样一来,就不需要“类型”列,问题和答案只会与测验相关,而不与模块相关,这对我来说更有意义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-14
      • 1970-01-01
      • 1970-01-01
      • 2021-11-08
      • 2014-08-12
      • 2016-12-31
      • 1970-01-01
      相关资源
      最近更新 更多