[指南] Strapi 自定義多語系欄位唯一值檢查

Strapi 針對集合型別 Collection 的個別欄位,有預設提供唯一值的檢查方法。不過若遇上一個集合物件有多國語言版本,且某個欄位在各國語言版本可相同,但另一個新物件卻得不同時,那預設的唯一值檢查條件是不能滿足的。這邊筆記下起因和解法思路。

build-headless-strapi-cms-qa-1


場景

為了方便解說,先舉一個情境和預期目標:

有一個集合型別 Collection 名為 Event,每個 Event 可以設定三種語言版本 (繁體中文、英文、日文),要檢查唯一值的欄位為 slut。在同一個 Event 下的三種語言版本,slut 可以相同或不同。不過當你新增了另一個 Event 時,輸入前一個 Event 的 slut 必須得報錯。

資料庫邏輯

雖說每個 Event 下面可以新增 3 種語言版本,不過在資料庫內都是新增在同一個 Table 內 ( 這邊為 Event Table )。只是在每筆記錄中加上 locale 欄位而已。同時會有另外一張表來記錄不同語言版本間的關聯性。

實作邏輯

由於 slug 在網頁呈現上具有唯一性。換言之,不同語言版本間,slug 是不能重複的。所以你可以在 beforeCreate 和 beforeUpdate 的時間點進行檢查。

1. beforeCreate 時,先取得要新增內容的語系,然後結合 slug 內容來檢查現在的 Event 表格記錄中的所有 slug 欄位有沒有重複的。如果有重複的就吐出錯誤。

2. beforeUpdate 時,取得當前文章的 id 和語系,然後結合 slug 內容進行檢查。不過檢查範圍調整成「排除當前文章後的所有記錄」即可。


程式碼


參考資料

1. https://docs.strapi.io/dev-docs/api/query-engine/filtering#not-1
2. https://forum.strapi.io/t/get-locale-from-beforeupdate-lifecycle-hook/17994

按讚加入粉絲團

延伸閱讀