2014-09-10 25 views
2

我正在使用Laravel的Eloquent ORM來查詢數據庫的信息,但由於某種原因生成的查詢未返回所有行。Eloquent ORM導致MySQL選擇不返回所有行


鋒查詢:

\Permit::selectRaw('CONCAT(lk_departments.dept_id, ".") AS dept_id, '. 
        'lk_departments.dept_name, '. 
        'COUNT(DISTINCT permits.permit_number) AS total') 
     ->leftJoin('lk_departments', 'permits.dept_id', '=', 'lk_departments.dept_id') 
     ->where('permits.permit_number', '!=', 'N/A') 
     ->whereBetween('permits.valid_date', [$query_info['start_date'], $query_info['end_date']]) 
     ->groupBy('lk_departments.dept_name') 
     ->orderBy('lk_departments.dept_name', 'ASC') 
     ->get() 


得到的查詢:

SELECT 
CONCAT(lk_departments.dept_id, ".") AS dept_id, lk_departments.dept_name, 
COUNT(DISTINCT permits.permit_number) AS total 
FROM permits 
LEFT JOIN lk_departments ON permits.dept_id = lk_departments.dept_id 
WHERE permits.valid_date BETWEEN '01/01/2000' AND '12/12/2100' 
GROUP BY lk_departments.dept_name 
ORDER BY lk_departments.dept_name ASC 


返回的數據:

dept_id    dept_name      total 
+--------------------------------------------------------+ 
| NULL NULL          0 | 
| 1.  Academic Achievement-(Special Services) 11 | 
| 3.  Academic Clubs        1 | 
| 4.  Academic Custodial & Grounds Services  1 | 
| 5.  Accounting         2 | 
| 6.  Admissions         356 | 
| 7.  Advanced Programs Dept (Education Dept) 8 | 
| 9.  Aerospace Studies - Air Force ROTC   1 | 
| 11. American Federation of Teachers   0 | 
| 13. Anthropology        1 | 
| 14. Art Dept.         4 | 
| 17. Athletic Dept.        11 | 
| 21. Biology Dept.        2 | 
|              | 
| ... ...          ... | 
+--------------------------------------------------------+ 


我提到這個問題,修改totalCount distinct values

,但我仍然收到一個NULL一行0total和失蹤記錄。我對MySQL不太好,所以如果我錯過了一些東西,請原諒我。理想情況下,我希望每個部門在特定時間範圍內獲得許可。

注:
dept_id =自動遞增鏈接到一個部門

+0

將加入其中'dept_id爲IS NOT NULL'不省略那些不需要的行? – tadman 2014-09-10 19:22:42

+0

由於某些原因,添加'dept_id IS NOT NULL'會返回一個空集。 – hellaminx 2014-09-10 21:25:14

+1

這特別奇怪。作爲一個註釋,你應該避免在查詢中使用表示類型的東西,比如將'.'附加到數字中,而不是保存它在任何視圖中顯示的時候。 – tadman 2014-09-10 21:35:49

回答

1

我終於找出問題所在。當我在連接中使用permits作爲主表時,我忽略意識到如果沒有來自permits.dept_id的匹配lk_departments.dept_id的相應記錄(如果沒有人爲該部門註冊許可,則不會顯示dept_id的記錄)也就是說)。另外,出於某種原因,我不得不更改查詢以包含記錄,其中permits.permit_number is null

得到的雄辯查詢:

LKDepartment::selectRaw('lk_departments.*, COUNT(permits.permit_number) AS total') 
      ->leftJoin('permits', 'lk_departments.dept_id', '=', 'permits.dept_id') 
      ->whereNull('permits.permit_number') 
      ->orWhereRaw("(permits.permit_number != 'N/A' AND permits.valid_date BETWEEN '$query_info[start_date]' AND '$query_info[end_date]')") 
      ->groupBy('lk_departments.dept_id') 
      ->orderBy('lk_departments.dept_id', 'ASC') 
      ->get() 

結果查詢:

SELECT lk_departments.* , COUNT(permits.permit_number) AS total 
FROM lk_departments 
LEFT JOIN permits ON lk_departments.dept_id = permits.dept_id 
WHERE permits.permit_number IS NULL 
OR (
    permits.permit_number != 'N/A' 
    AND permits.valid_date BETWEEN '01/01/2000' AND '12/12/2100' 
) 
GROUP BY lk_departments.dept_id 
ORDER BY lk_departments.dept_id ASC 

返回的數據:

dept_id    dept_name      total 
+--------------------------------------------------------+ 
| NULL NULL          0 | 
| 1  Academic Achievement-(Special Services) 11 | 
| 2  Academic Advising Center     0 | 
| 3  Academic Clubs        1 | 
| 4  Academic Custodial & Grounds Services  1 | 
| 5  Accounting         2 | 
| 6  Admissions         356 | 
| 7  Advanced Programs Dept (Education Dept) 8 | 
| 8  Advisory Council       0 | 
| 9  Aerospace Studies - Air Force ROTC   1 | 
| 10  Alternative School       0 | 
| 11  American Federation of Teachers   0 | 
| 12  Anthropology        0 | 
|              | 
| ... ...          ... | 
+--------------------------------------------------------+ 
0

主鍵
permits =表包含停車證信息我猜使用ORM你不能做的情況下。您應該以編程方式解決問題,如果您使用的是orm,它的更好的做法是,將數據庫映射到對象而不用處理結果

+0

你可以使用帶有Eloquent ORM的case 'selectRaw'方法。這只是使用Eloquent之後得到的查詢**。 – hellaminx 2014-09-10 18:57:22