Maison  >  Questions et réponses  >  le corps du texte

Comment mettre à jour la colonne Laravel Eloquent convertie en collection

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粉741678385P粉741678385226 Il y a quelques jours437

répondre à tous(2)je répondrai

  • P粉019353247

    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,
      ...
    ];
    

    répondre
    0
  • P粉668113768

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

    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 < /a>

    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
      ];
    }
    
    - 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)🎜 🎜

    répondre
    0
  • Annulerrépondre