Maison > Questions et réponses > le corps du texte
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.
P粉0193532472024-03-31 00:48:23
Essayez de le convertir en collection AsCollection
use Illuminate\Database\Eloquent\Casts\AsCollection; protected $casts = [ 'meta' => AsCollection::class, ... ];
P粉6681137682024-03-31 00:03:22
Utilisation requiseIlluminateDatabase 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 de < /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 ]; }
AsCollection::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 utiliser
namespace App\Models; use Illuminate\Database\Eloquent\Model; class Item extends Model { protected $casts = [ 'meta' => 'array', // automatically convert value of 'meta' to array ]; }- Documentation Laravel (7.x)🎜 🎜