如何将此内连接mysql查询转换为Laravel的流畅?

时间:2017-07-18 21:39:29

标签: php mysql laravel join

我有这个内连接查询,我想要转换为Laravel的流利。它部分工作的东西。我能够得到结果,但mysql支持的运算符如and我发现很难将它应用于我的流畅查询。

mysql查询:

SELECT students.surname as Name, subjects.name as Subject, grades.name as Class, terms.name as Term, score as Score

from scores
    inner join students
        on students.id = scores.student_id
        and scores.student_id = 1
    inner join subjects
        on subjects.id = scores.subject_id
        and scores.student_id = 1
    inner join grades
        on grades.id = scores.grade_id
        and scores.student_id = 1
    inner join terms 
        on terms.id = scores.term_id
        and scores.student_id = 1

where scores.term_id = 1 or scores.term_id = 2 or scores.term_id = 3;

laravel query:

$scores = \DB::table('scores')
        ->join('students', 'students.id', '=', 'scores.student_id')
        ->join('subjects', 'subjects.id', '=', 'scores.subject_id')
        ->join('grades', 'grades.id', '=', 'scores.grade_id')
        ->join('terms', 'terms.id', '=', 'scores.term_id')
        ->select('students.surname', 'subjects.name', 'grades.name', 'terms.name', 'score')
        ->where('students.id', '=', '1', 'and', 'scores.term_id', '=', '1', 'or', 'scores.term_id', '=', '2', 'or', 'scores.term_id', '=', '3')
        ->get();

我现在遇到的问题是在我的where子句中。这似乎是和操作符被忽略并返回不在结果集中的结果。

这是我得到的结果集: enter image description here

第4期不应该在结果集中,因为它是第4项。注意第1期是第1期,第2期是第2期,第3期是第3期

2 个答案:

答案 0 :(得分:1)

使用whereBetween来获得您想要的结果:

$scores = \DB::table('scores')
        ->join('students', 'students.id', '=', 'scores.student_id')
        ->join('subjects', 'subjects.id', '=', 'scores.subject_id')
        ->join('grades', 'grades.id', '=', 'scores.grade_id')
        ->join('terms', 'terms.id', '=', 'scores.term_id')
        ->select('students.surname', 'subjects.name', 'grades.name', 'terms.name', 'score')
        ->where('students.id', 1)
        ->whereBetween('scores.term_id', [1, 3])
        ->get();

答案 1 :(得分:0)

查看https://laravel.com/docs/5.4/queries#where-clauses以获取更多文档,但您可以清理where where子句(您可以更改文档以表示您在右上角使用的laravel版本)。

而不是 sub_str = 'qw' {k: v for k, v in dict_example if v == sub_str}

执行:

->where('students.id', '=', '1', 'and', 'scores.term_id', '=', '1', 'or', 'scores.term_id', '=', '2', 'or', 'scores.term_id', '=', '3')