Laravel多对多态关系与数据透视表上的额外关系

时间:2019-03-23 10:53:46

标签: laravel

我有一个如下的架构:

articles
    id - integer
    name - string

images
    id - integer
    name - string

videos
    id - integer
    name - string

feedback_questions
    id - integer
    question - string

feedbackables
    id - integer
    feedback_question_id - integer
    feedbackable_id - integer        
    feedbackable_type - string

feedback_responses
    id - integer
    feedbackable_id - integer (FK to feedbackables.id)
    user_id - integer
    response - text

因此,许多反馈问题(例如,请按1-5的等级进行评分,您是否会推荐此内容等)可以应用于许多内容类型(文章,图片,视频)。

此反馈问题可以得到解答。

我在多对多设置方面都没有问题,例如

模型Article.php

public function feedbackQuestions()
{
    return $this->morphToMany('App\FeedbackQuestion', 'feedbackable');
}

模型FeedbackQuestion.php

...
public function articles()
{
    return $this->morphedByMany('App\Article', 'feedbackable');
}
...

但是,如何首先定义多余的列,然后再使用它呢?

我首先认为一对多就足够了,但这需要在数据透视表本身上指定,例如

模型Feedbackable.php

public function question()
{
    return $this->hasOne('App\FeedbackQuestion', 'id', 'feedback_question_id');
}

public function answers()
{
    return $this->hasMany('App\FeedbackResponse', 'id', 'feedbackable_id');
}

显然这并不理想,因为它会使所有内容变得笨拙。

我的最终目标是能够做到这一点。

$articleFeedbacks = Article::find(1)->with('feedbackQuestions.answers');

我已经考虑过查询构建器中的联接,这行得通吗?理想情况下,我想找到一个基于关系的解决方案,但我想知道是否有可能?我的架构不是一成不变的,所以有没有更好的方法来定义它?

为任何帮助预先加油。

0 个答案:

没有答案