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

时间:2014-12-23 10:27:47

标签: php jquery mysql json laravel

我需要一个建议我正在使用laravel而且我不确定我是否应该去多对多(mysql)或者留在表中编码的Json(其余代码工作正常),希望我能够解释它正确。所以在这里,用户必须解决有问题的考试,并且点击按钮时问题会发生变化(每个问题都在同一个div上,内容在点击时用jquery改变),所以当用户按下开始时它会显示3个问题(例如)无线电盒作为答案,其中一个是正确的。在用户选择答案形式单选按钮并单击下一步之后,他的答案(值)存储在会话中,然后相同的div显示不同的问题,依此类推。一旦用户得到最后一个问题,他的答案将从会话中获取并发送到电子邮件。所以现在为代码部分,考试表的结构。

   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 个答案:

答案 0 :(得分:3)

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

我建议使用这样的架构:

考试

  • 标题
  • 持续时间
  • remember_token

问题

  • 文本
  • exam_id

答案

  • 文本
  • question_id
  • correct(boolean)

然后定义以下关系

考试模型

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

的更多信息