iT邦幫忙

2023 iThome 鐵人賽

DAY 21
0
自我挑戰組

PHP 沿途的風景系列 第 21

[Day 21] Call Api: Resource 分頁顯示

  • 分享至 

  • xImage
  •  

Call Api: Resource 分頁顯示

曾經我對 Laravel 分頁的方法名稱感到疑惑,我曾經以為 Eloquent’s resource 表示單一筆資料,那多筆資料就是 resources 囉! ((翻車翻的很徹底))

直至我問工作室的 M 同學,為什麼 Eloquent’s resource 的複數,你會覺得是 collection?

M 同學答: 多筆資料表示是集合,方法名稱 collection 蠻合理。
從此,我就記成單筆資料 resource; 多筆資料 collection

多筆資料輸出

繼上一篇末尾得知,使用 Eloquent’s resource 遇到多筆資料輸出,可以使用 Eloquent’s resource 的 static function collection(),如:

<?php
Route::get('product', function(){
    
    $allProduct = Product::all();
    return ProductResource::collection($allProduct);
}
  • 多筆資料 - 分頁輸出 paginate(),如:
<?php
Route::get('product', function(){
    
    // 一頁顯示 4 筆資料
    $pageProduct = Product::paginate(4);
    return $pageProduct;
}

  • 多筆資料 - 分頁輸出 Eloquent’s resource collection() + paginate(),如:
<?php
Route::get('product', function(){
    
    // 一頁顯示 4 筆資料
    $pageProduct = Product::paginate(4);
    return ProductResource::collection($pageProduct);
}
  • 輸出結果:
{
    "data": [
        {
            "id": 1,
            "customer_id": 1,
            "product_number": "230626000001"
        },
        {
            "id": 2,
            "customer_id": 1,
            "product_number": "230626000002"
        },
        {
            "id": 3,
            "customer_id": 1,
            "product_number": "230626000003"
        },
        {
            "id": 4,
            "customer_id": 3,
            "product_number": "230626000004"
        }
    ],
    "links": {
        "first": "http://127.0.0.1:8001/v1/product?page=1",
        "last": "http://127.0.0.1:8001/v1/product?page=2",
        "prev": null,
        "next": "http://127.0.0.1:8001/v1/product?page=2"
    },
    "meta": {
        "current_page": 1,
        "from": 1,
        "last_page": 2,
        "links": [
            {
                "url": null,
                "label": "&laquo; Previous",
                "active": false
            },
            {
                "url": "http://127.0.0.1:8001/v1/product?page=1",
                "label": "1",
                "active": true
            },
            {
                "url": "http://127.0.0.1:8001/v1/product?page=2",
                "label": "2",
                "active": false
            },
            {
                "url": "http://127.0.0.1:8001/v1/product?page=2",
                "label": "Next &raquo;",
                "active": false
            }
        ],
        "path": "http://127.0.0.1:8001/v1/product",
        "per_page": 4,
        "to": 4,
        "total": 8
    }
}

Resource Collections

建立 Resource Collection: php artisan make:resource ProductCollection

  • 多筆資料 - 分頁輸出 Eloquent’s resource collection
    make() + paginate(),如:
<?php
Route::get('product', function(){
    
    // 一頁顯示 4 筆資料
    $pageProduct = Product::paginate(4);
    return ProductCollection::make($pageProduct);
}
  • 輸出結果:

    • 同 『多筆資料 - 分頁輸出 Eloquent’s resource collection() + paginate()』,不過 Eloquent’s resource 和 Eloquent’s resource collection 底層是不太相同的,有興趣可以自己追一下!
  • ps. 兩者不同於,ProductCollection 為什麼可以做到分頁的效果,ProductCollection 多了 ProductResource 什麼東東?! LengthAwarePaginator


參考文章

後端專屬: API Resource Collection


上一篇
[Day 20] Call API: Format Response
下一篇
[Day 22] Call API: SystemResponse 結合 Resource Collections
系列文
PHP 沿途的風景30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言