你好,我只想检索学生尚未参加的测验行 当他完成测验时,在QuizStudent表中完成的变量将变为1
我的关系: 测验模式:
public function quizstudents(){
return $this->hasMany('App\Quizstudent');
}
QuizStudent模式:
public function quiz(){
return $this->belongsTo('App\Quiz','quiz_id');
}
我尝试使用查询生成器进行操作
$idUser = Auth::User()->id;
$quizs= DB::table('quizzes')
->join('quizstudents', 'quizzes.id', '=', 'quizstudents.quizze_id')
->select('quizzes.id')
->where([['quizstudents.student_id','=',$idUser],['quizstudents.done','=','0']])
->distinct()
->get();
但是问题是我的视图出现了错误
未定义的属性:stdClass :: $ classe
因为在视图中,我使用了雄辩的样式示例:$quiz->answer
,并且因为我想使用分页等。
所以我试图将上面的QueryBuilder代码转换为雄辩的,我试图这样做:
$quizs= Quiz::with('quizstudents')->whereIn('classe_id', $classes)->where([['quizstudents.student_id','=',$idUser],['quizstudents.done','=','0']])->orderBy('created_at','desc')->paginate(10);
但是我得到了错误
Column not found: 1054 Unknown column 'quizstudents.student_id' in 'where clause' (SQL: select count(*) as aggregate from `quizzes` where `classe_id` in (1) and (`quizstudents`.`student_id` = 79 and `quizstudents`.`done` = 0))
感谢您的时间,在此先抱歉
编辑:最下面的两个答案都很棒,它们都在起作用 感谢帮助的人,请不要错过该设置的部分 关系中的外键(如果不同于) 正常情况下,我创建了模态测验和 使用modal:make Quiz -mc同时迁移和控制 并没有意识到复数测验是测验,所以当我设置完 我关于quizze_id的外键将是默认值,但是 Laravel太聪明了,知道应该默认使用quiz_id, 英语上的运气可能会伤害您,请当心。 英文
答案 0 :(得分:1)
您不是在加入Eloquent模型,如果加入也会得到比预期更多的行,则可以通过使用distinct解决此问题。一个简单的子查询解决方案是改用whereHas()
。
Quiz::with('quizstudents')
->whereIn('classe_id', $classes)
->whereHas('quizstudents', function ($query) use ($idUser) {
$query->where('student_id', $idUser);
$query->where('quizstudents.done', '0');
})
->orderBy('created_at','desc')
->paginate(10);
这并没有比加入更快,但是实现起来却相当简单,我认为这是一个开始。
答案 1 :(得分:0)
那呢:
$doneQuizes = Quizstudents::where('student_id', $idUser) - >get() ;
$quizzes = Quiz::whereNotIn('id', $doneQuizes->pluck('quiz_id')) - >paginate(20);
不确定您的模型...。但是您明白了。 我知道另一个答案是好的...但是,为什么要为一个简单的任务那么多bloatware。