iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 12
1
Modern Web

使用 Laravel 打造 RESTful API系列 第 12

動物排序

使用Laravel 8 PHP主流框架打造RESTful API(iT邦幫忙鐵人賽系列書)ISBN:9789864345304

本系列文章已集結成冊與鐵人賽文章差異內容,有以下幾點:

更新至Laravel 8、基礎的PHP重點筆記、加強製作API流程細節、加入程式設計模式,優化、重構程式碼的部分,並且於書籍前面的章節介紹Git。

讓您從製作第一個簡單的API到優化自己的程式碼,分享我的經驗給您,打造自己的最強大腦API,若有興趣的朋友可以參考看看

天瓏網路書局:
https://www.tenlong.com.tw/products/9789864345304


此篇文章同步發表於個人部落格

昨天參考別人的網址是如何設計的,排序的方式參數都是使用 sort ,由於它們都有客製化的排序方式。比如說依照出版日期...

我一樣打算做自由度高一點,透過使用 sorts (就是要跟別人不一樣) 參數來操作。此參數的值以逗號分隔的排序欄位,並且可以使用「:」分隔,將排序方向附加到每個排序欄位。

asc 表示升序或 desc 表示降序。

格式

大約類似像這樣!

/api/animal?sorts=name:asc,id:desc

name 欄位進行排序升序(小->大),再由id倒序(大->小)排列

撰寫程式

繼續把查詢功能製作完整!

app/Http/Controllers/AnimalController.php

public function index(Request $request)
{
    // 設定預設值

    $marker = isset($request->marker) ? $request->marker : 1;
    $limit = isset($request->limit) ? $request->limit : 10;

    $query = Animal::query();

    // 篩選欄位條件
    if (isset($request->filters)) {
        $filters = explode(',', $request->filters);
        foreach ($filters as $key => $filter) {
            list($criteria, $value) = explode(':', $filter);
            $query->where($criteria, $value);
        }
    }

    //排列順序
    if (isset($request->sort)) {
        $sorts = explode(',', $request->sort);
        foreach ($sorts as $key => $sort) {
            list($criteria, $value) = explode(':', $sort);
            if ($value == 'asc' || $value == 'desc') {
                $query->orderBy($criteria, $value);
            }
        }
    } else {
        $query->orderBy('id', 'asc');
    }

    $animals = $query->where('id', '>=', $marker)->paginate($limit);

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

終於把查詢功能做完了!再次強調設計方法有很多。如果日後有時間再來補充 篩選、排序其他格式的設計。

建議如果一開始想先做個可以動的成品,可以先照個做就好,以後經驗多了!自然就可以判斷要怎麼設計比較好~


上一篇
篩選動物
下一篇
驗證資料格式、設定系統語系
系列文
使用 Laravel 打造 RESTful API30

1 則留言

0
stca
iT邦新手 5 級 ‧ 2020-09-02 09:51:35

站長您好
拜讀了你的 使用 Laravel 打造 RESTful API
目前進度到第12篇
想請教您
到12篇為止的查詢功能
查詢單一、全部資料、查詢預設起始條件、分頁查詢、分頁篩選
能同時存在嗎
例如:
/api/animal?filters=name:黑,和 /animal?sorts=name:asc,id:desc
這兩條api可以同時存在嗎
如果你有看到的話,還請您撥空解惑
謝謝

Victor iT邦新手 4 級 ‧ 2020-09-02 10:25:46 檢舉

您好!
依照範例的寫法可以同時存在喔!

查詢資源列表,篩選以及排序可以一起使用如下網址,使用& 連結
/api/animal?filters=name:黑&sorts=name:asc,id:desc

如要查詢這些資料的第2頁可以在使用 page 如下範例
/api/animal?filters=name:黑&sorts=name:asc,id:desc&page=2

感謝您的提問!如果有問題歡迎在提出感謝^^

我要留言

立即登入留言