Heim  >  Fragen und Antworten  >  Hauptteil

So aktualisieren Sie die Spaltenbesetzung von Laravel Eloquent in der Sammlung

Ich verwende Laravel 10.

Ich nutze die Konvertierung von JSON-Spalten über:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Item extends Model
{
  protected $casts = [
    'meta' => 'collection', // here
  ];
}

Zum Beispiel, wenn Sie versuchen, einen Wert in einer Sammlung direkt zu aktualisieren:

$model->meta->put('test', 100);
$model->save();

Keine Antwort.

Wenn ich die Variable so zuweise, wie sie ist, funktioniert es einwandfrei.

$model->meta = ['test' => 100];
$model->save();

Aber was ist, wenn ich nur ein einzelnes Element aktualisieren/hinzufügen muss?

Ich habe die folgende Problemumgehung gefunden, aber ist das das erwartete Verhalten?

$meta = $model->meta;
$meta->put('test', 100);
$model->meta = $meta;
$model->save();

In diesem Fall scheint nur die direkte Zuweisung zu funktionieren, und das Casting der Sammlung scheint keine ihrer Schreibfunktionen zu unterstützen.

P粉741678385P粉741678385226 Tage vor436

Antworte allen(2)Ich werde antworten

  • P粉019353247

    P粉0193532472024-03-31 00:48:23

    尝试将其转换为集合 AsCollection

    use Illuminate\Database\Eloquent\Casts\AsCollection;
    
    
    protected $casts = [
      'meta' => AsCollection::class,
      ...
    ];
    

    Antwort
    0
  • P粉668113768

    P粉6681137682024-03-31 00:03:22

    解决方案(Laravel 8.28 或更高版本)

    需要使用Illuminate\Database\ Eloquent\Casts\AsCollection 而不是 'collection'

    $casts 数组中,您可以定义各个键的类型。通过指定类型的类(必要时),Laravel 自动处理转换。这就是为什么具体使用 AsCollection::class< /a> 是必需的。

    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Model;
    use Illuminate\Database\Eloquent\Casts\AsCollection;
    
    class Item extends Model
    {
      protected $casts = [
        'meta' => AsCollection::class, // automatically convert value of 'meta' to Collection::class
      ];
    }
    
    更多信息



    解决方案(Laravel 7.x 或更低版本)

    AsCollection 在 Laravel 8.x 或更高版本中默认可用。 如果您需要旧版本中的集合功能,则需要 自己创建自定义演员表

    或者也可以使用 'array'演员:

    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Model;
    
    class Item extends Model
    {
      protected $casts = [
        'meta' => 'array', // automatically convert value of 'meta' to array
      ];
    }
    
    更多信息

    Antwort
    0
  • StornierenAntwort