日本語の値をString型のカラム投稿しているはずなのに"\u3042\uff53\uff44\uff46”
のような謎の文字列になる場合。
カラムの型と投稿時する値の型が一致していない可能性がある。
ちなみにこのままでもブラウザ上で呼び出したときはちゃんと日本語に戻るときもあるが、データベースの検索などでは使えなくなりそうなので直したほうがいい。
今回はモデル内の$casts
にいらんこと書いたことが原因だったのでその修正方法を紹介。
ジャンプできる目次
修正方法
今回の例では、stockというテーブル内で起こった事象なので、該当のモデルを確認。
//Stock.php修正前
//中略
class Stock extends Model
{
protected $guarded = ['id'];
protected $casts = [
'fileInfo' => 'json',
'tags' => 'json',
'rejected_reason' => 'json',
'rejected_reason_comment' => 'json',
];
use HasFactory;
//以下略
}
'rejected_reason_comment' => 'json',
が不要。
↓
//Stock.php修正後
//中略
class Stock extends Model
{
protected $guarded = ['id'];
protected $casts = [
'fileInfo' => 'json',
'tags' => 'json',
'rejected_reason' => 'json',
//削除
//'rejected_reason_comment' => 'json',
];
use HasFactory;
//以下略
}
原因
モデル(今回ではStock.php)の
protected $casts = [ ]
の中には、json形式で保存したいカラムをあらかじめ指定することが多い。
指定しなくていいやり方もあるかもしれないが、試したことはない。
String型で作成したカラムまで間違ってここにjsonとして登録してしまっていた。
逆にjson形式のカラムなのに、ここの記載を忘れていたり、json以外の型のカラムにjson形式の値をポストしても同じことが起こりえると思われる。
$castsとは
属性キャストは、モデルで追加のメソッドを定義することなく、アクセサやミューテタと同様の機能を提供します。定義する代わりに、モデルの
$casts
プロパティにより属性を一般的なデータ型に変換する便利な方法を提供します。
Laravel 8.x Eloquent:ミューテタ/キャスト
要するに、
「このカラムに投稿するときは、○○型に変換して投稿してね!」
って簡単に指示できるみたい。
json以外でも使えるみたい。
毎回コントローラーに型変換メソッド書くの確かにめんどくさいもんな。
コントローラーとモデルに2重で書いたらどうなるのかはわからん。
今後間違って書いちゃったらまた追記する。