J'utilise Laravel 10.
J'exploite la conversion des colonnes JSON via :
namespace App\Models; use Illuminate\Database\Eloquent\Model; class Item extends Model { protected $casts = [ 'meta' => 'collection', // here ]; }
Par exemple, lorsque vous essayez de mettre à jour directement une valeur dans une collection :
$model->meta->put('test', 100); $model->save();
Aucune réponse.
Lorsque j'attribue la variable telle quelle, cela fonctionne bien.
$model->meta = ['test' => 100]; $model->save();
Mais que se passe-t-il si je n'ai besoin de mettre à jour/ajouter qu'un seul élément ?
J'ai trouvé la solution de contournement suivante, mais est-ce un comportement attendu ?
$meta = $model->meta; $meta->put('test', 100); $model->meta = $meta; $model->save();
Dans ce cas, seule l'affectation directe semble fonctionner, et la diffusion de la collection ne semble prendre en charge aucune de ses capacités d'écriture.
Essayez de le convertir en collection
AsCollection
Solution (Laravel 8.28 ou supérieur)
Utilisation requise
IlluminateDatabase EloquentCastsAsCollection
而不是'collection'
.Dans le tableau
$casts
$casts
数组中,您可以定义各个键的类型。通过指定类型的类(必要时),Laravel 自动处理转换。这就是为什么具体使用AsCollection::class
vous pouvez définir le type de chaque clé. Laravel gère automatiquement la conversion en spécifiant la classe du type (si nécessaire). C'est pourquoi l'utilisation spécifique deest requise.
Plus d'informations-
Transformation de propriété (liste de conversion)- - Documentation Laravel (10.x)
Conversions de tableaux, d'objets et de collections- - Documentation Laravel (10.x)
Laravel 8 ajoute de nouvelles transitions- - Laravel News
- Documentation de l'API LaravelAsCollection::class
Solution (Laravel 7.x ou inférieur)
.AsCollection
Disponible par défaut dans Laravel 8.x ou supérieur. Si vous avez besoin des fonctionnalités définies dans les anciennes versions, vous devrez créer vous-même une distribution personnalisée'array'
Ou vous pouvez également utiliserActeur :
Plus d'informations-
Comment faire une transformation personnalisée
- Documentation Laravel (7.x)🎜 🎜