Eloquent ORM导致MySQL选择不返回所有行

时间:2014-09-10 17:04:25

标签: mysql laravel orm laravel-4 eloquent

我正在使用Laravel的Eloquent ORM来查询数据库以获取信息,但由于某种原因,结果查询没有返回所有行。


雄辩查询:

\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

但我仍然会收到一个NULLtotal 0且缺少记录。我对MySQL不是很了解,所以如果我错过了什么,请原谅我。理想情况下,我想在给定的时间范围内计算每个部门的许可证数量。

注意:
dept_id =自动递增的主键
permits =包含链接到部门的停车许可信息的表

2 个答案:

答案 0 :(得分:1)

我终于找到了问题所在。当我在联接中使用permits作为主表时,我忽略了dept_id的记录如果没有来自permits.dept_id的相应记录则不会显示匹配lk_departments.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    | 
|                                                        |
| ...    ...                                        ...  |
+--------------------------------------------------------+ 

答案 1 :(得分:0)

我想使用一个orm你不能做一个案子。您应该以编程方式解决问题,如果您使用的是orm,则更好的做法是,将数据库映射到对象而不处理结果