2015-10-22 140 views
0

student_attendance table structure student 我不知道为什么我无法正常使用左侧使用laravel 4LEFT JOIN不laravel工作

我的 '学生' 表结构在MySQL连接是:

id|name 

和“attendance_student”表:

id|date|student_id 

我想告诉所有的学生和他们的存在或在特定的一天缺席。

例如,在某一天,如果一个学生是不存在的,它的ID和日期将在“attendance_student”表中输入

我的查询:

$student = DB::table('students') 
     ->leftJoin('attendance_student', 'students.id', '=', 'attendance_student.student_id') 
     ->select('students.id', 'students.name', 'attendance_student.present') 
     ->where('attendance_student.date', '=', '2015-10-14') 
     ->get(); 

echo '<table>'; 
      foreach ($student as $attendance) 
      { 
       echo "<tr>"; 
       echo "<td>$attendance->name</td>"; 
       echo "<td>$attendance->present</td></tr>"; 
      } 
echo '</table>'; 

但是,如果某一天,如果学生缺席我只收到那个学生的资料。我的问题是我想显示该班的所有学生。目前我只能通过这个显示缺席的学生

+0

Wha字段和值意味着学生存在/缺席? –

+0

1表示存在,0表示不存在 – Ash

回答

1

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

+0

这是在SO中发布问题时发生错字。已修改但结果相同 – Ash

0

的问题是你的WHERE,将其更改为:

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

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

+0

已更改查询,但仍不起作用 $ student = DB :: table('students') \t \t - > leftJoin('attendance_student','students.id','=',' attendance_student.student_id ') \t \t - >选择(' students.id ' 'students.name', 'attendance_student.present') \t \t - >其中( 'attendance_student.date', '=',' 2015 - 10-14') \t \t - > orWhere('attendance_student.date','=',NULL) \t \t - > get(); – Ash

+0

如果您尝试删除“where”,该怎么办?除了它会显示所有日期的事实,是你想要的结果吗? – SebHallin

+0

将获得该表的所有数据。理想情况下,希望所有学生和他们的缺席状态 – Ash

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.我将“attendance_student.present”重命名为“缺席”,只是为了让我们阅读时更有意义,但并不重要。