Type de tableau de migration Laravel (stocker le tableau dans la colonne de la base de données))

je veux stocker un tableau d'entiers dans ma table et je ne trouve aucun type qui supporte le tableau dans Documentation, n'importe quelle suggestion.

Migration:

public function up()
{
    Schema::create('pickups', function (Blueprint $table) {
        $table->increment('id');
        $table->boolean('default');
        $table->integer('shifts');  <<--------- HERE I want to store an array of integers
        $table->integer('status_id');

        $table->timestamps();
    });
}
17
demandé sur Zakaria Acharki 2015-10-05 20:28:08

1 réponses

array datatype n'est pas présent dans tous les systèmes de base de données et parce que le constructeur de schéma de Laravel est agnostique base de données, il n'offre pas de méthodes pour créer des colonnes de type de données non communes. Vous avez donc deux options:

1. utilisez une instruction SQL brute pour ajouter la colonne, quelque chose comme l'instruction ci-dessous devrait fonctionner. Bien que je ne suis pas sûr si le constructeur de requête ou éloquent peut gérer ces types de colonnes correctement:

DB::statement('ALTER TABLE pickups ADD COLUMN shifts integer[]');

2. utilisez la solution de contournement D'Eloquent en utilisant attribut casting. Dans votre migration, créez la colonne json comme ceci:

public function up()
{
    Schema::create('pickups', function (Blueprint $table) {
        $table->increment('id');
        $table->boolean('default');
        $table->json('shifts');
        $table->integer('status_id');

        $table->timestamps();
    });
}

alors vous pouvez configurer votre Pickup modèle (si vous ne l'avez pas encore fait) et utilisez le $casts propriété:

class Pickup extends Model
{
    protected $casts = [
        'shifts' => 'array'
    ];
}

cela permettra à Eloquent de savoir que lorsqu'il récupère des données de la base de données, il devra convertir le shifts valeur de la colonne d'un array. Ceci n'émule qu'un tableau réel, car au niveau de la base de données la colonne est de type TEXT et le tableau est sérialisé. Cependant lors de la désérialisation de la valeur de la colonne, Eloquent retourne un tableau réel d'entiers à utiliser dans votre code. Ci-dessous est un exemple de cas d'utilisation:

// Create a new Pickup entry
$pickup = App\Pickup::create([
    'default' => true,
    'shifts' => '[1, 5, 7]', // you can easily assign an actual integer array here
    'status_id' => 1
]);

en supposant que ce qui précède génère une entrée avec id égal 1 lorsque vous récupérez plus tard l'entrée:

$pickup = App\Pickup::find(1);
dump($pickup->shifts);

dump() à partir du code ci-dessus produira un réel tableau d'entiers:

array:3 [▼
  0 => 1
  1 => 5
  2 => 7
]
32
répondu Bogdan 2015-10-06 09:54:12