2015-10-05 18 views
13

benim tabloda Sayı dizisi depolamak istiyorum ve Documentation yılında dizi destekleyen her tür herhangi bir öneri bulamıyorum.laravel göç dizisi tip

Göç:

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

cevap

24

array veri türü tüm veritabanı sistemlerinde mevcut değildir ve laravel en Şema Oluşturucu veritabanı agnostik, bunun nedeni olmayan ortak veri türü sütunlar oluşturmak için yöntemler sunmamaktadır. Yani iki seçeneğiniz vardır:

1. Sütunu eklemek için ham bir SQL deyimi kullanın, aşağıdaki gibi bir şey işe yaraması gerektiğini düşünüyorum. Emin değilim rağmen Sorgu Oluşturucu veya Eloquent doğru sütunların bu tür işleyebilir eğer:

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

2. Kullanım Eloquent en uygun çözüm attribute casting kullanarak. taşımanıza şöyle json olarak sütun oluşturun:

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

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

Sonra yapabilirsiniz kurulum senin Pickup modeli (Daha önce yapmadıysanız) ve $casts özelliğini kullanın:

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

Bu irade Eloquent'in veriyi veritabanından aldığında, shifts sütun değerini array'a dönüştürmesi gerektiğini bilmesine izin verin. Bu, veritabanı seviyesinde olduğu gibi, sütun TEXT türünde olduğu gibi gerçek bir diziyi taklit eder ve dizi serileştirilir. Ancak sütun değeri sıraya alındığında, Eloquent kodunuzda kullanmanız için gerçek bir tamsayılar dizisi döndürür.

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

dump() kodundan irade çıkışı gerçek dizi yukarıda: Daha sonra girdiyi aldığınızda id eşit 1 için yukarıda oluşturulan bir giriş varsayarsak

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

: Aşağıda bir örnek kullanıldığı durumdur Tamsayılar:

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

Teşekkürler @Bogdan sizin greate cevabınız için, ne yazık ki 'shifts' ile yeni alma girişi oluşturmaya çalıştığımda => [1, 5 , 7], '' bu hatayı alıyorum msg 'PHP uyarısı: preg_replace(): Parametre uyuşmazlığı, model bir dizgedir. –

+0

tamam şimdi '' vardiyalar '=>' [1, 5, 7] ', ', teşekkürler :) –

+0

gibi çalışıyorum. Bunu Laravel 5.1'in temiz yüklemesi ile test ettim ve benim için aslında teklif vermeden çalışıyor değeri atarken dizinin etrafında. – Bogdan