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 保留在表中的主要内容,如果未能解决你的问题,请参考以下文章