如何从其他表中获取方法中的数据?

时间:2018-11-01 10:21:55

标签: laravel-5 eloquent

enter image description here

这是我的简单数据库模式。现在在我的组表中,我有“ group_A”和“ group_B”。在问题表中,我对group_A有10个问题,对group_B有5个问题。 Users表是一个ID = 1的用户。我试图做的是获取这样的数据:

SELECT answer
FROM answers
JOIN questions q ON (q.id = answer.question_id)
JOIN group g ON (g.id = q.group_id)
WHERE user_id = 1 AND g = 'group_A'

我在用户类中有模型,我希望创建方法来获取答案取决于组:

public function getAnswers($group) {
        return $this->hasMany('App\Answers', 'question_id', 'id');
    }

我怎么能用这种方法呢?我应该在问题类中创建方法组吗?

1 个答案:

答案 0 :(得分:1)

不确定如何在采用输入参数的模型中定义这种关系,但是您可以在模型中定义范围以按组过滤得到答案

class Answer extends Model {

    public function user()
    {
        return $this->belongsTo('App\User');
    }

    public function question()
    {
        return $this->belongsTo('App\Question');
    }

    public function scopeGroup($query, $name)
    {
        return $query->whereHas('question.group', function($q) use($name){
                    $q->where('name', '=', $name);
        });
    }
}

我假设在答案模型中您已经定义了问题的关系,并且类似地在问题模型中您已经定义了组模型的关系。

在查询构建器中,您可以将其编写为

$answers = Answer::group('group_A')
                 ->whereHas('user', function($q) use($userid){
                    $q->where('id', '=', $userid);
                 })->get();

或者您也可以将过滤器应用于渴望加载的关系

$users = User::with(['answers' => function($query)
{
    $query->whereHas('question.group', function($q){
        $q->where('name', '=', 'group_A');
    });

}])->get();

如果您已有用户对象,则可以通过

来获得特定组的答案。
$answers = $user->answers()
                ->whereHas('question.group', function($q){
                    $q->where('name', '=', 'group_A');
            })->get();