首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Laravel 5多态关系

Laravel 5多态关系
EN

Stack Overflow用户
提问于 2016-02-15 07:15:34
回答 3查看 366关注 0票数 1

这一点还不完全清楚,因为这将是我第一次对此进行修补。我的桌子结构如下:

代码语言:javascript
复制
questions
- id
- type_id

multiple_choice_options
- id
- question_id

drag_and_drop_options
- id
- question_id

type_id表上的questions字段确定要从哪个选项表加载。因此,基本上,我想在Question模型上建立一个关系,如下所示:

代码语言:javascript
复制
class Question extends Model {
    public function options() {
        // not sure what to return here?
    }
}

对于期权模型,这会是正确的逆定义吗?

代码语言:javascript
复制
class MultipleChoiceOption extends Model {
    public function question() {
        return $this->belongsTo(Question::class);
    }
}

class DragAndDropOptions extends Model {
    public function question() {
        return $this->belongsTo(Question::class);
    }
}

我如何设置它来处理多态关系?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-02-15 07:26:05

您可以简单地在options()关系中构建一个开关:

代码语言:javascript
复制
class Question extends Model {
    public function options() {
        if ($type_id === 'multiple') {
            return $this->hasMany(MultipleChoiceOption::class);
        } else {
            return $this->hasMany(DragAndDropOptions::class);
        }
    }
}

小心这些神奇的关系,你将需要额外的类型检查和仔细的编码在您的应用程序。

票数 0
EN

Stack Overflow用户

发布于 2016-02-15 11:03:42

看看关于多态性的Laravel博士,有一些功能可以在数据结构略有不同的情况下加以利用:

代码语言:javascript
复制
questions
- id
- optionable_id
- optionable_type

multiple_choice_options
- id

drag_and_drop_options
- id

型号:

代码语言:javascript
复制
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列将包含所属模型的类名。

顺便提一句,您的数据结构关系逻辑在我看来有点奇怪,但可能仍然适用于您试图做的事情。我可能会有模型QuestionOptionQuestionType,这样选项就可以独立于问题和问题类型了。这将使您能够在不必更改选项的情况下更改问题类型。

票数 0
EN

Stack Overflow用户

发布于 2017-02-13 18:14:34

考虑到你想要达到的目标:

(A)选择权只能属于一个问题,

(B)一个问题可以有许多选择,

我认为更干净的解决方案可能包括调整你的数据库设计,

代码语言:javascript
复制
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',这会使代码更加简洁。当您添加新的问题类型时,您也不需要编辑代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35403486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档