Laravel 数据库多对多(Mysql)或将 Json 保留在表中

Posted

技术标签:

【中文标题】Laravel 数据库多对多(Mysql)或将 Json 保留在表中【英文标题】:Laravel Database Many to Many (Mysql) or keep Json in table 【发布时间】:2015-02-21 11:37:26 【问题描述】:

我需要一个建议,我正在使用 laravel,但我不确定我应该多对多(mysql)还是留在表中编码的 Json(其余代码工作正常),希望我能够解释它正确。所以在这里,用户必须解决一个有问题的考试,并且点击按钮时问题会发生变化(每个问题都在同一个 div 上,内容会在点击 jquery 时发生变化),所以当用户按下开始时,它会显示问题 3 (例如)作为正确答案的单选框。在用户选择答案表单单选按钮并单击下一步后,他的答案(值)存储在会话中,然后同一个 div 显示不同的问题等等。一旦用户回答了最后一个问题,他的答案就会从 Session 中提取并发送到电子邮件中。那么现在是代码部分,考试表的结构。

   Schema::create('exams', function(Blueprint $table)
        
        $table->increments('id');
                    $table->string('title')->unique();
                    $table->text('questions_json'); //json encode see example below
                    $table->integer('duration');
                    $table->string('remember_token',64);
                    $table->timestamps();
        );

'questions_json' 看起来像(这是示例)

[

   
    "Question": "1+1?",
    "1": "11",
    "2": "2",
    "3": "-2",
    "correct": "2"
,

    "Question": "What is a rabbit?",
    "1": "Mammal",
    "2": "Vicious beast with sharp teeth",
    "3": "Cute thing",
    "correct": "1"


]

这就是我现在所拥有的,因此控制器读取此 json 文本并从中删除正确的文本,然后将带有问题和答案的 json 发送到 jquery,然后生成带有单选按钮和下一个按钮的表单。

但是一旦问题出现,这个“管理员”就无法编辑(必须将 id 放入 json 中以便他能够编辑),但管理员唯一需要更改此槽形式的时间是他输入错误时。所以我不确定我是否应该这样离开或将数据库结构更改为多对多。

【问题讨论】:

【参考方案1】:

在您的数据库中存储 JSON 数据(几乎)从来都不是一个好主意。例如,正如您所注意到的,当您想要编辑数据时会变得很复杂。

我建议这样的架构:

考试

标题 持续时间 remember_token

问题

文字 exam_id

答案

文字 question_id 正确(布尔值)

然后定义以下关系

考试模式

public function questions()
    return $this->hasMany('Question');

问题模型

public function answers()
    return $this->hasMany('Answer');


public function exam()
    return $this->belongsTo('Exam');

答案模型

public function question()
    return $this->belongsTo('Question');

更多关于Relations in the Laravel Docs的信息

【讨论】:

教了这么多,目前所有艰难的 json 看起来都是一个更简单的解决方案,但从长远来看,如果需要更改某些内容,它会导致问题。感谢您提供的架构,这对我有很大帮助。

以上是关于Laravel 数据库多对多(Mysql)或将 Json 保留在表中的主要内容,如果未能解决你的问题,请参考以下文章

laravel ORM 一对一 一对多 多对多 原生的MYSQL怎么写

Laravel - 将数据保存到多对多关系

与同一张表的关系(多对多?) - Laravel

在多对多关系 laravel4 的情况下更新数据透视表

使用 laravel 从多对多检索数据

Laravel 5 雄辩的多对多关系问题