0

我正在研究简单的邮资跟踪系统,我试图用这个查询做的是返回带有最新跟踪状态名称的包裹。

我曾经DB::select执行过这个查询,它工作得很好,但我不能用paginate它。

DB::select(DB::raw('SELECT p.*, 
       (SELECT status.name 
        FROM   status 
               INNER JOIN tracking 
                       ON tracking.status_id = status.id 
        WHERE  tracking.package_id = p.id 
        ORDER  BY tracking.id DESC 
        LIMIT  1) AS status_name 
FROM   packages AS p 
WHERE  p.is_deleted = 0 
ORDER  BY p.id DESC'));

那么有什么办法可以使用paginate它..?或者我可以使用DB::table而不是DB::select

这是我的桌子

packages table:
+----+-------------+------------+
| id | tracking_no | account_no |
+----+-------------+------------+
|  3 |      852369 |      90905 |
+----+-------------+------------+

tracking table:
+----+------------+-----------+
| id | package_id | status_id |
+----+------------+-----------+
|  3 |          3 |         1 |
|  9 |          3 |         2 |
| 10 |          3 |         3 |
+----+------------+-----------+

status table:
+----+------------------+
| id |       name       |
+----+------------------+
|  1 | Ready            |
|  2 | Out for delivery |
|  3 | Delivered        |
+----+------------------+

这是我的查询

SELECT p.*, 
       (SELECT status.name 
        FROM   status 
               INNER JOIN tracking 
                       ON tracking.status_id = status.id 
        WHERE  tracking.package_id = p.id 
        ORDER  BY tracking.id DESC 
        LIMIT  1) AS status_name 
FROM   packages AS p 
WHERE  p.is_deleted = 0 
ORDER  BY p.id DESC
4

1 回答 1

1

DB::select 返回一个数组而不是集合/对象,因此不能直接在其上调用分页。如果您需要对查询进行分页,请使用 DB::table 或 eloquent。你可以试试这个。

 DB::table('packages')
      ->select(['packages.*',DB::raw('(SELECT status.name 
           FROM   status 
           INNER JOIN tracking 
           ON tracking.status_id = status.id 
           WHERE  tracking.package_id = packages.id 
           ORDER  BY tracking.id DESC 
           LIMIT  1) as status_name')])
      ->where('packages.is_deleted','=',0)
      ->orderBy('packages.id','desc')->paginate();

希望能帮助到你

于 2016-02-20T12:41:05.917 回答