这是我的简单数据库模式。现在在我的组表中,我有“ 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');
}
我怎么能用这种方法呢?我应该在问题类中创建方法组吗?
答案 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();