[淺談]在 Laravel 中使用 GraphQL(三)
前言
上一次我們談到了兩件事情,一是透過 Laravel 的 factory 跟 seed ,根據資料表的屬性產生大量的資料,並且將其寫入資料庫中;二是我們在 Laravel 上使用 GraphQL ,建立了 Query 跟 Type 來完成 GraphQL 中基礎的 schemas ,之後也利用了 GraphQL playground 來向資料庫請求商品資料表中的資料。
這次我們會談到當資料表之間有關聯時,如何在 model 之間建立連結,接者透過 GraphQL 向資料庫請求完整的資料;接者,當我們需要新增或是修改資料時,如何透過 Mutation 來達到資料的修改或新增。
Laravel:model relation→GraphQL: related Type
- products.id → product_tag_ralated.product_id
- product_tag_ralated.tag_id → product_tags.id
- products.product_category_id → product_category.id
上面的圖表與列表表達了我們在四張資料表之間的關聯,我們可以從 products 的 product_category_id 去對應到 product_categories 的 id,因此我們就可以知道 product 的商品類別是甚麼了;依此類推,來找到商品的標籤有哪些。
首先,我們需要先在 App\Product.php 新增與商品類別的關聯。
因為一個商品只會對應到一個商品類別,所以它們的關係是一對一的關係,所以透過 Laravel 的 hasOne 方法來建立關聯;其中第一個參數代表是的關聯資料表 model ,第二個可以設定為關聯對應的外鍵名稱,第三個則是關聯的外鍵名稱,關於參數的詳細說明可以到 Laravel 的官方文件去了解。
接者在 App\GraphQL\Type\ProductType.php 中加入 category 的屬性。
之後我們就可以在 graphql-playground 上測試看看是否有成功 query 到類別的資料。
成功獲得商品類別的資料後,接者我們想要知道該商品的標籤有哪些?在 product_tag_related 這張資料表告訴了我們 product 與 product_tag 兩張資料表的對應關係,一個商品可能會有多個標籤,一個標籤也有可能會被多個商品擁有;在 Larevel 官方文件中提到這是一個多對多的關係。
因此,我們需要先在 App\Product.php 新增與商品標籤的關聯。
belongsToMany 有四個參數,第一個參數一樣是關聯的 model ,第二個為兩者之間的關係資料表名稱, 第三個參數是關聯中的模型的外鍵名稱,而第四個則是要合併的模型中的外鍵名稱。詳細的說明可以去 Laravel 的官方文件了解。
接者在 App\GraphQL\Type\ProductType.php 中加入 tag 的屬性。
因為一個商品可能會有多個標籤,所以在前面用 listOf 的方式列舉出條件的資料。
之後我們一樣可以在 graphql-playground 上測試看看是否有成功 query 到標籤的相關資料。
到目前為止我們已經可以透過 GraphQl 向資料庫請求資料了,也成功將資料表之間的關聯建立起來了;接下來我們希望可以像資料庫新增或是修改一筆資料。
GraphQL:Mutation
在 app\GraphQL\Mutation 新增一個 CreateProductMutation.php ,在裡面我們會設定在新增一筆商品時需要給予的參數,以及接收到參數後要如何進行處理。
其中,在 tags 的參數是用字串的方式傳入,然後將字串切割後再與商品 ID 依序寫入 product_tag_related 資料表中。
之後到 app\Product.php 與 app\ProductTagRelated.php 中依序加入下面程式碼,為了要讓 model 知道那些屬性是能夠被寫入的。
最後,我們在 config\graphql.php 中加入 Mutation 的相關設定就完成了所有步驟。
我們一樣到 graphql-playground 來測試看看能不能新增資料到資料庫中。下面的結果圖可以知道 GraphQL 有成功新增一筆資料,而且 id 會自動遞增。
更新單筆資料可以參考下面的範例。
結論
終於,我們談完了如何在 Laravel 上使用 GraphQL 來向資料庫請求資料,但這只是一個初步的開始,還必須要去思考要如何防止被攻擊以及使用者的身份驗證的問題…等等,這些都值得一在地討論以及研究,還有在 resolve 向資料庫請求或是修改資料時,如何才能夠達到高效率。
總之,不管是哪種 php 的 Laravel 也好, GraphQL 也好,都只是一款工具,在我們學會了這些工具後,該如何去發揮我們所學,從我們所學的去解決遇到的問題才是一門學問。
謝謝各位的觀看,如有任何問題或是有寫錯的部分也可以在下方留言。
相關參考資料:
graphql-laravel:
Laravel 官方文件: