web-dev-qa-db-ja.com

Laravel eloquentはJSON列を更新しません:配列から文字列への変換

データベースの[〜#〜] json [〜#〜]列を更新したいのですが、次のエラーが発生します:

Array to string conversion  

モデルで列名をarrayとして宣言しました。

protected $casts = [
    'destinations' => 'array'
];

これは私が使用するコードです:

$data[] = [
    'from' => $fromArray,
    'to' => $toArray
];

Flight::where('id', $id)->update(['destinations' => $data]);

私は何をすべきか ?

7
Ramin

Githubでのこの会話によると: モデルフィールドが入力可能である場合はjson属性を入力可能にする テイラーオトウェルはsaveメソッドの使用を推奨しています:

$ model-> options = ['foo' => 'bar'];

$ model-> save();

だからあなたの場合、あなたはこのようにそれを行うことができます:

$flight = Flight::find($id); 
$flight->destinations = $data; 
$flight->save();
3
Maraboc

矢印を使用してjsonキーにアクセスできるため、次のように列を更新できます。

Flight::where('id', $id)->update([
   'destinations->from' => $data['from'],
   'destinations->to'  => $data['to']
]);

@fubarが述べたように、私のソリューションを機能させるには、 mysql 5.7 が必要です。

docs を確認してください

5
Amr Aly

基本的に生のSQLクエリを作成するだけのクエリビルダーを使用してモデルを更新しようとしているため、このエラーが発生します。モデル内で定義されているデータキャストなどは認識されません。したがって、次の3つの選択肢があります。

1)モデルを見つけて、モデルインスタンスで更新を実行します。

$flight = Flight::findOrFail($id);
$flight->update(['destinations' => $data]);

2)更新する前にデータを文字列に変換します。

$data = json_encode($data);
Flight::where('id', $id)->update(['destinations' => $data]);

3)@AmrAlyの提案に従って、JSON列クエリをサポートするデータベースを使用します。すべてのデータベースがJSON列をサポートしているわけではないため、このオプションに注意してください。

2
fubar