動物列表查詢及分頁

可以使用兩個查詢參數中的一個或兩個來實現分頁:

  • limt 返回多少項目
  • marker 指定從哪一個ID開始

例如:

HTTP 動詞請求網址說明
GET/api/animal?limit=10查詢10筆動物資料
GET/api/animal?limit=20&marker=3查詢從ID 3 開始的20筆資料!

Codeing Time

AnimalController

public function index(Request $request)
{
    // 設定預設值
    $marker = $request->marker==null ? 1:$request->marker;
    $limit = $request->limit==null ? 10:$request->limit;

    $animals = Animal::orderBy('id', 'asc')
        ->where('id', '>=', $marker)
        ->limit($limit)
        ->get();

    return response(['animals' => $animals], Response::HTTP_OK);
}

先設定系統預設值 limit 預設10筆,marker  預設值為1,所以未填寫任何查詢參數也是只會回傳10筆資料,並且由ID1的內容開始讀取。

我的animals資料表目前只有兩筆資料如下所示

{
    "animals": [
        {
            "id": 2,
            "type_id": 1,
            "name": "大黑",
            "birthday": "2017-01-01",
            "area": "台北",
            "fix": 1,
            "description": "非常可愛,非常任命的一隻狗",
            "personality": "認養他準沒錯",
            "created_at": "2019-08-24 16:55:29",
            "updated_at": "2019-08-24 16:55:29"
        },
        {
            "id": 3,
            "type_id": 1,
            "name": "黑熊",
            "birthday": "2017-01-01",
            "area": "台北",
            "fix": 1,
            "description": "黑狗,胸前有白毛!宛如台灣黑熊",
            "personality": "非常親人!很可愛~",
            "created_at": "2019-08-24 17:05:07",
            "updated_at": "2019-08-24 17:05:07"
        }
    ]
}

所以使用者請求

GET /api/animal?marker=3&limit=10

表示找id大於等於3的資料,並且只要顯示10筆資料。(不過我的資料表中大於等於3只有一筆資料,所以只會顯示一筆)

回應資料如下

{
    "animals": [
        {
            "id": 3,
            "type_id": 1,
            "name": "黑熊",
            "birthday": "2017-01-01",
            "area": "台北",
            "fix": 1,
            "description": "黑狗,胸前有白毛!宛如台灣黑熊",
            "personality": "非常親人!很可愛~",
            "created_at": "2019-08-24 17:05:07",
            "updated_at": "2019-08-24 17:05:07"
        }
    ]
}

分頁

把剛剛的程式修改一下 原本 limit()、get() 修改為 paginate($limit) 程式碼完成如下所示

public function index(Request $request)
{
    // 設定預設值
    $marker = $request->marker==null ? 1:$request->marker;
    $limit = $request->limit==null ? 10:$request->limit;

    $animals = Animal::orderBy('id', 'asc')
        ->where('id', '>=', $marker)
        ->paginate($limit);

    return response($animals, Response::HTTP_OK);
}

回應json結果

{
    "current_page": 1,
    "data": [
        {
            "id": 3,
            "type_id": 1,
            "name": "黑熊",
            "birthday": "2017-01-01",
            "area": "台北",
            "fix": 1,
            "description": "黑狗,胸前有白毛!宛如台灣黑熊",
            "personality": "非常親人!很可愛~",
            "created_at": "2019-08-24 17:05:07",
            "updated_at": "2019-08-24 17:05:07"
        }
    ],
    "first_page_url": "http://127.0.0.1:8000/api/animal?page=1",
    "from": 1,
    "last_page": 1,
    "last_page_url": "http://127.0.0.1:8000/api/animal?page=1",
    "next_page_url": null,
    "path": "http://127.0.0.1:8000/api/animal",
    "per_page": "1",
    "prev_page_url": null,
    "to": 1,
    "total": 1
}

Laravel 內建的查詢方法 paginate 真的非常方便!

Victor
Victor

哈囉!

文章: 220

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *