2015-10-22 92 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」重命名爲「缺席」,只是爲了讓我們閱讀時更有意義,但並不重要。