Comment mettre à jour la colonne Laravel Eloquent convertie en collection
P粉741678385
P粉741678385 2024-03-30 09:54:00
0
2
492

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粉741678385
P粉741678385

répondre à tous(2)
P粉019353247

Essayez de le convertir en collection AsCollection

use Illuminate\Database\Eloquent\Casts\AsCollection;


protected $casts = [
  'meta' => AsCollection::class,
  ...
];
P粉668113768

Solution (Laravel 8.28 ou supérieur)

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

est requise.
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
  ];
}
    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 AsCollection::class
- Documentation de l'API Laravel



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

Acteur :
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Item extends Model
{
  protected $casts = [
    'meta' => 'array', // automatically convert value of 'meta' to array
  ];
}
    Plus d'informations
  • Comment faire une transformation personnalisée
- Documentation Laravel (7.x)🎜 🎜
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal