这一点还不完全清楚,因为这将是我第一次对此进行修补。我的桌子结构如下:
questions
- id
- type_id
multiple_choice_options
- id
- question_id
drag_and_drop_options
- id
- question_idtype_id表上的questions字段确定要从哪个选项表加载。因此,基本上,我想在Question模型上建立一个关系,如下所示:
class Question extends Model {
public function options() {
// not sure what to return here?
}
}对于期权模型,这会是正确的逆定义吗?
class MultipleChoiceOption extends Model {
public function question() {
return $this->belongsTo(Question::class);
}
}
class DragAndDropOptions extends Model {
public function question() {
return $this->belongsTo(Question::class);
}
}我如何设置它来处理多态关系?
发布于 2016-02-15 07:26:05
您可以简单地在options()关系中构建一个开关:
class Question extends Model {
public function options() {
if ($type_id === 'multiple') {
return $this->hasMany(MultipleChoiceOption::class);
} else {
return $this->hasMany(DragAndDropOptions::class);
}
}
}小心这些神奇的关系,你将需要额外的类型检查和仔细的编码在您的应用程序。
发布于 2016-02-15 11:03:42
看看关于多态性的Laravel博士,有一些功能可以在数据结构略有不同的情况下加以利用:
questions
- id
- optionable_id
- optionable_type
multiple_choice_options
- id
drag_and_drop_options
- id型号:
class Question extends Model {
public function optionable() {
return $this->morphTo();
}
}
class MultipleChoiceOption extends Model {
public function question() {
return $this->morphMany('App\Question', 'optionable');
}
}
class DragAndDropOptions extends Model {
public function question() {
return $this->morphMany('App\Question', 'optionable');
}
}注意,optionable_type列将包含所属模型的类名。
顺便提一句,您的数据结构关系逻辑在我看来有点奇怪,但可能仍然适用于您试图做的事情。我可能会有模型Question,Option,QuestionType,这样选项就可以独立于问题和问题类型了。这将使您能够在不必更改选项的情况下更改问题类型。
发布于 2017-02-13 18:14:34
考虑到你想要达到的目标:
(A)选择权只能属于一个问题,
(B)一个问题可以有许多选择,
我认为更干净的解决方案可能包括调整你的数据库设计,
questions
- id
- body
- question_type_id
question_type
- id
- name
options
- id
- name
- question_id
class question extends Model {
public function options() {
$this->hasMany('App\option','question_id')
}
}
class option extends Model {
public function question() {
return $this->belongsTo('App\question');
}
}然后,您的question_type表将包含muiltiple_choice、拖放等,因此不需要使用'if‘语句或'switch',这会使代码更加简洁。当您添加新的问题类型时,您也不需要编辑代码。
https://stackoverflow.com/questions/35403486
复制相似问题