Strapi 針對集合型別 Collection 的個別欄位,有預設提供唯一值的檢查方法。不過若遇上一個集合物件有多國語言版本,且某個欄位在各國語言版本可相同,但另一個新物件卻得不同時,那預設的唯一值檢查條件是不能滿足的。這邊筆記下起因和解法思路。
場景
為了方便解說,先舉一個情境和預期目標:
有一個集合型別 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