左连接不在laravel工作

时间:2015-10-22 19:12:41

标签: php mysql laravel-4

student_attendance table structure student 我不知道为什么我无法使用laravel 4

在mysql中正确使用左连接

我的学生'表结构是:

'project2.exe': Loaded
'C:\Users\David\Documents\VisualStudio2010\Projects
 \project2\Debug\project2.exe',
 Symbols loaded.
 'project2.exe': Loaded 'C:\Windows\System32\ntdll.dll',
 Cannot find or open the PDB file
 ' project2.exe': Loaded 'C:\Windows\System32\kernel32.dll',
 Cannot find or open the PDB file
 'project2.exe': Loaded 'C:\Windows\System32\d2d1.dll',
 Cannot find or open the PDB file
 'project2.exe': Loaded 'C:\Windows\System32\msvcrt.dll',
 Cannot find or open the PDB file
 'project2.exe': Loaded 'C:\Windows\System32\user32.dll',
 Cannot find or open the PDB file
 'project2.exe': Loaded 'C:\Windows\System32\gdi32.dll',
 Cannot find or open the PDB file
 'project2.exe': Loaded 'C:\Windows\System32\advapi32.dll',
 Cannot find or open the PDB file
 'project2.exe': Loaded 'C:\Windows\System32\rpcrt4.dll',
 Cannot find or open the PDB file
 'project2.exe': Loaded 'C:\Windows\System32\msvcr100d.dll',
 Symbols loaded.
 'project2.exe': Loaded 'C:\Windows\System32\imm32.dll',
 Cannot find or open the PDB file
 'project2.exe': Loaded 'C:\Windows\System32\msctf.dll',
 Cannot find or open the PDB file
 'project2.exe': Loaded 'C:\Windows\System32\lpk.dll',
 Cannot find or open the PDB file
 'project2.exe': Loaded 'C:\Windows\System32\usp10.dll',
 Cannot find or open the PDB file
 'project2.exe': Loaded 'C:\Windows\System32\uxtheme.dll',
 Cannot find or open the PDB file
 First-chance exception at 0x698509bf in project2.exe: 0xC0000005:
 Access violation writing location 0x00000000.
 Unhandled exception at 0x698509bf in project2.exe: 0xC0000005:
 Access violation writing location 0x00000000.

和' attendance_student'表是:

id|name

我希望在特定日期向所有学生及其现在或缺席表示。

例如,在特定的一天,如果学生缺席,其身份和日期将输入' attendance_student'表

我的查询:

id|date|student_id

但是,如果学生缺席的那一天我只能获得该学生的数据。我的问题是我想要显示该班级的所有学生。目前我只能通过这个显示缺席的学生

4 个答案:

答案 0 :(得分:1)

您想要一个左连接,但您只是使用常规连接。您应该使用->leftJoin

答案 1 :(得分:0)

问题在于您WHERE,请将其更改为:

->where('attendance_student.date', '=', '2015-10-14')
->orWhere('attendance_student', '=', null)

使用leftJoin时,不需要匹配。但是在你的WHERE中,它需要设置日期(日期= 2015-10-14),这与用连接替换leftJoin相同。

答案 2 :(得分:0)

所以显然你只有缺席学生的日期......(?)。

如果是这样的话...我会尝试看起来像这样的东西:

SELECT students.id, students.name, 0 as absent FROM students 
WHERE students.id not in (
     SELECT attendance_student.id FROM attendance_student 
     WHERE attendance_student.date = '2015-10-14'
)

UNION

SELECT students.id, students.name, attendance_student.present as absent 
FROM students INNER JOIN attendance_student 
ON students.id = attendance_student.student_id 
WHERE attendance_student.date = '2015-10-14'

因此,请让所有在该特定日期出现的学生先行,然后将他们与缺席的学生联系起来。

P.S。我正在重命名"出勤率[缺席者]缺席'缺席只是为了在我们阅读时更有意义,但这并不重要。

答案 3 :(得分:0)

我遇到了类似的问题,下一个找到的解决方案

替换此

->leftJoin('attendance_student', 'students.id', '=', 'attendance_student.student_id')

为此

->leftJoin('attendance_student', function($join){
            $join->on('students.id', '=', 'attendance_student.student_id');
            $join->on('attendance_student.date', '=', DB::raw('2015-10-14'));
        })

最后删除您的

->where('attendance_student.date', '=', '2015-10-14')

因为在进行查询时,您将强制在

中进行注册
  

attendance_student

祝你好运!