記錄一次因 mysql 欄位取名不規範導致的問題

xujinhuan發表於2021-07-31
  1. bug 出現過程
    我使用的是 laravel-admin(1.8.10) 框架,使用框架提供的 Form 元件搭建 Form 表單,其中用到了 checkbox 元件,資料庫取的欄位名稱是tagIds ,欄位型別是 json

    程式碼如下:

    $form->checkbox('tagIds', '選擇XX')->options(['1' => 'xx', '2' => 'xxx'])

    就這樣出現了問題。

  2. 問題描述
    表單提交沒有任何問題,但是在修改資料時,其他欄位都能正常顯示已有的值,唯獨使用了 checkbox 的欄位無法選中已選中的選項。

  3. 解決問題
    首先懷疑是不是取回該欄位的時候返回的不是陣列格式,經過列印資料,發現返回的該欄位值是 null(從資料庫中取出來的資料結果確實是陣列格式)
    ,經過一系列的排查,到 laravel-admin 底層順藤摸瓜,終於找到了問題根本:
    laravel-admin在 Encore\Admin\Form 使用了 Encore\Admin\Traits\ShouldSnakeAttributes
    類。
    Encore\Admin\Form\Field 類繼承了 Encore\Admin\Form\Field\MultipleSelect 類,在 MultipleSelect 類的方法 fill 裡有下面這段程式碼:

         if ($this->form && $this->form->shouldSnakeAttributes()) {
             $key = Str::snake($this->column);
         } else {
             $key = $this->column;
         }

    看到這裡問題就顯而易見了,在修改渲染頁面的時候,將欄位轉換成了蛇形命名方式,然後尋找的是蛇形欄位的值,所以像 tagIds 這種的欄位就找不到原欄位的值了

  4. 解決方式
    tagIds 這種命名欄位的方式改為 tag_ids,問題最終得以解決。

謹以此記錄一下該問題,以防下次再遇到同樣的錯誤。也在這裡提醒一下使用 laravel-admin 框架的朋友,這裡有個坑!

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章