使用Laravel雄辩地加入

时间:2020-06-01 11:06:56

标签: php laravel join eloquent

你好,我只想检索学生尚未参加的测验行 当他完成测验时,在QuizStudent表中完成的变量将变为1 enter image description here

测验表

我的关系: 测验模式:

 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, 英语上的运气可能会伤害您,请当心。 英文

2 个答案:

答案 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。