iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 25
1
Software Development

後端新手 使用laravel 從零開始 到開出api系列 第 25

Day25 設計使用者關聯的CRUD

Day25 設計使用者關聯的CRUD

上次我介紹了如何做出最簡單的api,而其中有些漏洞,我希望對資料的CRUD時這些資料是跟該user相關的,沒有關聯的話操作會有很大的問題,我不希望看到其他使用者也能隨意對我的資料做CRUD。
之前介紹過的簡易trello專案,我會使用其中一支api當範例。
我再講一次我專案的架構吧

  1. 一個使用者擁有多張Card
  2. 每張Card裏面有多個task
  3. 每張Card裏面有多個使用者可以編輯它

而我資料的關係為

  1. user以及card為多對多
  2. task以及card為一對多

列出所有的card

例如現在我要製作一個api是顯示user所有的card,以下是我的controller內容:

    public function index(Request $request)
    {
        $userData = $request->userData;
        $cards = $userData->ShowCards;
        foreach ($cards as $card) {
            $card->ShowTasks;
        }
        return response()->json(['status' => true, 'user_data' => $userData], 200);
    }

說明:

  • 3
    第3行我想解釋一下,並不是我的request中有userData參數,而是userData這個資源是我從middleware中,透過使用者request中帶的token,從db中拿到的而我只是順帶把他傳到controller中而已,而現在我將他取出。
  • 4
    我將$userData使用ShowCards這物件,他是我在model中設計的多對多關聯function,這代表我會有該user關聯的所有card。
  • 5~7
    因為card不只一張,好幾張card的資料會以陣列的型式顯示,而我想要一起知道每張card的所有task,因此我使用foreach回圈,讓每張card都關聯到對應的task。關聯過後我的$userData變會有該user的資訊、該user所有的card和task
  • 8
    輸出json格式的response

Postman測試結果

{
    "status": true,
    "user_data": {
        "id": 3,
        "username": "gill",
        "email": "gill@gmail.com",
        "image": "",
        "created_at": "2020-09-15T04:01:19.000000Z",
        "updated_at": "2020-10-07T07:02:46.000000Z",
        "show_cards": [
            {
                "id": 9,
                "card_name": "hello",
                "create_user": "admin-fdd456",
                "created_at": "2020-09-17T08:33:01.000000Z",
                "updated_at": "2020-10-05T07:45:49.000000Z",
                "private": false,
                "pivot": {
                    "users_id": 3,
                    "card_id": 9
                },
                "show_tasks": [
                    {
                        "id": 7,
                        "title": "new task",
                        "status": false,
                        "create_user": "gill",
                        "update_user": "gill",
                        "description": "",
                        "tag": "",
                        "image": null,
                        "card_id": 9,
                        "created_at": "2020-10-07T07:04:01.000000Z",
                        "updated_at": "2020-10-07T07:04:01.000000Z"
                    }
                ]
            },
            {
                "id": 13,
                "card_name": "card name",
                "create_user": "gill",
                "created_at": "2020-09-25T10:28:55.000000Z",
                "updated_at": "2020-09-25T10:28:55.000000Z",
                "private": true,
                "pivot": {
                    "users_id": 3,
                    "card_id": 13
                },
                "show_tasks": []
            }
        ]
    }
}

以上是我的方法,我將user有關聯的所有資料全都拿出來了,雖然這只有CRUD中的Read的部份,不過其他功能也一樣的。
例如你想要作card的CRUD,你只要在function的開始部份先關聯到該user的所有card,再使用where方法找到要修改的card,此方法就可以避免其他user對你的card作CRUD了。
向這樣經過關聯後再操作CRUD我們的使專案又更加嚴謹,不會單純只有CRUD功能,它能判斷你是否有資格操作這項資料。


上一篇
Day24 laravel 登入token驗證
下一篇
Day26 laravel mail 登入系統 忘記密碼
系列文
後端新手 使用laravel 從零開始 到開出api30

尚未有邦友留言

立即登入留言