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
]
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'. –
ok ora funziona come segue ''shift' => '[1, 5, 7]',', grazie :) –
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