2015-10-05 17 views
13

Desidero memorizzare una matrice di numeri interi nella mia tabella e non riesco a trovare alcun tipo che supporti l'array in Documentation, qualsiasi suggerimento.Laravel migration array type

Migrazione:

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(); 
    }); 
} 

risposta

24

Il array tipo di dati non è presente in tutti i sistemi di database e perché Schema Builder di laravel è il database agnostico, non offre metodi per creare colonne tipo di dati non comuni. Quindi hai due opzioni:

1. Utilizzare un'istruzione SQL raw per aggiungere la colonna, qualcosa di simile alla seguente affermazione, penso che dovrebbe funzionare. Anche se non sono sicuro se il Generatore di query o Eloquente in grado di gestire questi tipi di colonne correttamente: disponibile soluzione

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

2. Usa di Eloquente utilizzando attribute casting. In migrazione creare la colonna come json in questo modo:

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

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

Quindi è possibile configurare il modello di Pickup (se non l'avete già fatto) e utilizzare la proprietà $casts:

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

Questa volontà fai sapere a Eloquent che quando recupera i dati dal database, dovrà convertire il valore della colonna shifts in uno array. Questo emula solo un array effettivo, poiché a livello di database la colonna è di tipo TEXT e l'array è serializzato. Tuttavia, quando non si sta serializzando il valore della colonna, Eloquent restituisce un effettivo array di numeri interi da utilizzare nel codice. Sotto è un caso esempio uso:

// 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 
]); 

Supponendo sopra generata una voce con id uguale a 1 quando successivamente recuperare l'entrata

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

Il dump() dalla seguente output una matrice reale di numeri interi:

array:3 [▼ 
    0 => 1 
    1 => 5 
    2 => 7 
] 
+0

Grazie a @Bogdan per la tua risposta, purtroppo quando provo a creare una nuova voce di prelievo con "shift" => [1, 5 , 7], 'ricevo questo errore msg' Avviso PHP: preg_replace(): Parameter mismatch, pattern è una stringa mentre replacement è un array'. –

+0

ok ora funziona come segue ''shift' => '[1, 5, 7]',', grazie :) –

+0

Ho provato questo con un'installazione pulita di Laravel 5.1 e per me funziona davvero senza collocare virgolette attorno all'array quando si assegna il valore. – Bogdan

Problemi correlati