2014-09-10 73 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