[淺談]在 Laravel 中使用 GraphQL(三)

Jian-Kai,Kuo
LT Lab
Published in
7 min readNov 26, 2019
圖片來自: https://blog.pusher.com/graphql-laravel/

前言

上一次我們談到了兩件事情,一是透過 Laravel 的 factory 跟 seed ,根據資料表的屬性產生大量的資料,並且將其寫入資料庫中;二是我們在 Laravel 上使用 GraphQL ,建立了 Query 跟 Type 來完成 GraphQL 中基礎的 schemas ,之後也利用了 GraphQL playground 來向資料庫請求商品資料表中的資料。

這次我們會談到當資料表之間有關聯時,如何在 model 之間建立連結,接者透過 GraphQL 向資料庫請求完整的資料;接者,當我們需要新增或是修改資料時,如何透過 Mutation 來達到資料的修改或新增。

Laravel:model relation→GraphQL: related Type

資料表之間的關聯圖
  1. products.id → product_tag_ralated.product_id
  2. product_tag_ralated.tag_id → product_tags.id
  3. products.product_category_id → product_category.id

上面的圖表與列表表達了我們在四張資料表之間的關聯,我們可以從 products 的 product_category_id 去對應到 product_categories 的 id,因此我們就可以知道 product 的商品類別是甚麼了;依此類推,來找到商品的標籤有哪些。

首先,我們需要先在 App\Product.php 新增與商品類別的關聯。

App\Product.php 與 category的關聯

因為一個商品只會對應到一個商品類別,所以它們的關係是一對一的關係,所以透過 Laravel 的 hasOne 方法來建立關聯;其中第一個參數代表是的關聯資料表 model ,第二個可以設定為關聯對應的外鍵名稱,第三個則是關聯的外鍵名稱,關於參數的詳細說明可以到 Laravel 的官方文件去了解。

接者在 App\GraphQL\Type\ProductType.php 中加入 category 的屬性。

App\GraphQL\Type\ProductType.php 新增類別的屬性

之後我們就可以在 graphql-playground 上測試看看是否有成功 query 到類別的資料。

graphql-playground 成功獲得 category 的資料

成功獲得商品類別的資料後,接者我們想要知道該商品的標籤有哪些?在 product_tag_related 這張資料表告訴了我們 product 與 product_tag 兩張資料表的對應關係,一個商品可能會有多個標籤,一個標籤也有可能會被多個商品擁有;在 Larevel 官方文件中提到這是一個多對多的關係。

因此,我們需要先在 App\Product.php 新增與商品標籤的關聯。

App\Product.php 與 tag 的關聯

belongsToMany 有四個參數,第一個參數一樣是關聯的 model ,第二個為兩者之間的關係資料表名稱, 第三個參數是關聯中的模型的外鍵名稱,而第四個則是要合併的模型中的外鍵名稱。詳細的說明可以去 Laravel 的官方文件了解。

接者在 App\GraphQL\Type\ProductType.php 中加入 tag 的屬性。

App\GraphQL\Type\ProductType.php 新增標籤的屬性

因為一個商品可能會有多個標籤,所以在前面用 listOf 的方式列舉出條件的資料。

之後我們一樣可以在 graphql-playground 上測試看看是否有成功 query 到標籤的相關資料。

graphql-playground 成功獲得 tag 的資料

到目前為止我們已經可以透過 GraphQl 向資料庫請求資料了,也成功將資料表之間的關聯建立起來了;接下來我們希望可以像資料庫新增或是修改一筆資料。

GraphQL:Mutation

在 app\GraphQL\Mutation 新增一個 CreateProductMutation.php ,在裡面我們會設定在新增一筆商品時需要給予的參數,以及接收到參數後要如何進行處理。

app\GraphQL\Mutation\CreateProductMutation.php

其中,在 tags 的參數是用字串的方式傳入,然後將字串切割後再與商品 ID 依序寫入 product_tag_related 資料表中。

之後到 app\Product.php 與 app\ProductTagRelated.php 中依序加入下面程式碼,為了要讓 model 知道那些屬性是能夠被寫入的。

app\Product.php
app\ProductTagRelated.php

最後,我們在 config\graphql.php 中加入 Mutation 的相關設定就完成了所有步驟。

config\graphql.php 加入設定

我們一樣到 graphql-playground 來測試看看能不能新增資料到資料庫中。下面的結果圖可以知道 GraphQL 有成功新增一筆資料,而且 id 會自動遞增。

GraphQL 成功新增一筆資料
在資料庫中也看到第 51 筆資料被新增了

更新單筆資料可以參考下面的範例。

EditProductMutation.php
graphql-playground 的結果

結論

終於,我們談完了如何在 Laravel 上使用 GraphQL 來向資料庫請求資料,但這只是一個初步的開始,還必須要去思考要如何防止被攻擊以及使用者的身份驗證的問題…等等,這些都值得一在地討論以及研究,還有在 resolve 向資料庫請求或是修改資料時,如何才能夠達到高效率。

總之,不管是哪種 php 的 Laravel 也好, GraphQL 也好,都只是一款工具,在我們學會了這些工具後,該如何去發揮我們所學,從我們所學的去解決遇到的問題才是一門學問。

謝謝各位的觀看,如有任何問題或是有寫錯的部分也可以在下方留言。

相關參考資料:

graphql-laravel:

Laravel 官方文件:

--

--