bug 出現過程
我使用的是 laravel-admin(1.8.10) 框架,使用框架提供的 Form 元件搭建 Form 表單,其中用到了 checkbox 元件,資料庫取的欄位名稱是tagIds
,欄位型別是 json程式碼如下:
$form->checkbox('tagIds', '選擇XX')->options(['1' => 'xx', '2' => 'xxx'])
就這樣出現了問題。
問題描述
表單提交沒有任何問題,但是在修改資料時,其他欄位都能正常顯示已有的值,唯獨使用了 checkbox 的欄位無法選中已選中的選項。解決問題
首先懷疑是不是取回該欄位的時候返回的不是陣列格式,經過列印資料,發現返回的該欄位值是 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 這種的欄位就找不到原欄位的值了
解決方式
將tagIds
這種命名欄位的方式改為tag_ids
,問題最終得以解決。
謹以此記錄一下該問題,以防下次再遇到同樣的錯誤。也在這裡提醒一下使用 laravel-admin 框架的朋友,這裡有個坑!
本作品採用《CC 協議》,轉載必須註明作者和本文連結