【问题标题】:Use Laravel Eloquent joining使用 Laravel Eloquent 加入
【发布时间】:2020-06-01 11:06:56
【问题描述】:

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

测验表

我的人际关系: 测验模式:

 public function quizstudents(){
        return $this->hasMany('App\Quizstudent');

    }

QuizStudent 模式:

  public function quiz(){
        return $this->belongsTo('App\Quiz','quiz_id');

    }

我尝试使用 Query Builder 来实现它正在工作

 $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

因为在视图中我使用 Eloquent 样式示例:$quiz->answer 并且因为我想使用分页等..

所以我尝试将上面的 QueryBuilder 代码转换为 eloquent 我尝试了这个:

   $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))

感谢您的宝贵时间,并提前向您道歉

编辑:底部的两个答案都很棒,他们都在工作 感谢帮助的人,请不要错过要设置的部分 如果它与什么不同,则在关系中增加你的外键 正常的一点解释我创建了模态测验和 使用模态同时迁移和控制器:make Quiz -mc 并没有意识到 quiz 的复数形式是 quizzes 所以当我设置 我认为关于 quizze_id 的外键将是默认值,但是 Laravel 太聪明了,知道默认应该是 quiz_id, 英语的运气会伤害你当心这个并且对不起我的坏事 英文

【问题讨论】:

  • 错字? quiztudents()quizstudents()?
  • 我修好了,但还是一无所获

标签: php laravel join eloquent


【解决方案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);

这并不比连接快,但实现起来相当简单,我认为首先是要走的路。

【讨论】:

  • 首先感谢您的快速而惊人的回答Quiz::quizstudents()" 我在你的解释中遗漏了什么吗?
  • 把quizstudents改成quiztudents
  • @OMR 谢谢我修正了错字但这段代码仍然没有工作我得到错误 SQLSTATE[42S22]: Column not found: 1054 Unknown column 'quizstudents.quiz_id' in 'where Clause' ( SQL: select count(*) as aggregate from quizzes where classe_id in (1) and exists (select * from quizstudents where quizzes.id = quizstudents.quiz_id and student_id = 79 和quizstudents.done = 0))
  • 这就像我在寻找 quizstudents.quiz_id 但在我的 quistudents 表中它是 quizze_id 为什么我在寻找 quiz_id ?
  • 好吧,伙计们,我错过了设置关系属性非常感谢大家:) public function quizstudents(){ return $this->hasMany('App\Quizstudent','quizze_id') ; }
【解决方案2】:

这个呢:

$doneQuizes = Quizstudents::where('student_id', $idUser) - >get() ;
$quizzes = Quiz::whereNotIn('id', $doneQuizes->pluck('quiz_id')) - >paginate(20);

不确定你的模型......但你明白了。 我知道另一个答案很好......但是为什么一个简单的任务有这么多英国媒体报道。

【讨论】:

  • 哦,那太好了,我必须在帮手和很多事情上工作,我是初学者,谢谢
  • 如果有可能,我会回复您的答案,谢谢
猜你喜欢
  • 2022-10-04
  • 2014-11-21
  • 2014-07-07
  • 2014-04-17
  • 2018-08-16
  • 2022-01-13
  • 2021-07-03
  • 2022-01-25
  • 1970-01-01
相关资源
最近更新 更多