2016-03-22 22 views
2

Ben yeni 5.2 için yeni ve postgres pgsql. Bir tablo (yanlış olabilir) benim anlayışıma göre buna uygun LogLaravel 5.2 elverişli otomatik artış pgsql istisnası aynı kimlik üzerinde

class Log extends Model{ 
     public $incrementing = true; 
     public $timestamps = false; 
} 

Schema::create('logs', function(Blueprint $table){ 
       $table->bigIncrements('id'); 
       $table->text('exception'); 
       $table->dateTime('created_at'); 
      }); 

logs ve bir model adında var. id verilmediyse, Eloquent son kullanılan id + 1'i (ancak buna karşı boş değil) kullanır. İlk Log kaydediyorum, kesinlikle onun için 1 olacak ve sonraki için 2 olacak. Ben id=1

ile anlamlı save() ile tek bir kayıt eklemiş Ama burada ben bir şekilde (el veya csv dosyası ile bir ekleme sorgusu ile) id 2,3,5,8 e.t.c. ile yeni kayıtlar eklerseniz sorun, gelir varsayalım masada. Ancak save, Eloquent programatik olarak ikinci Log kayıt/varlık için hala id = 2'u ayarlar.

şimdi çözümü yukarıda bu

$l = new Log(); 
$l->exception = "some exception"; 
$l->created_at = Carbon::now()->toDateTimeString(); 

while(true){ 
    try{ 
      $l->save(); //it auto increments the id on each try 
      break; 
    }catch(\Exception $e){ 
      continue; 
    } 
} 

Watch gibi döngü saklıyorum benim için çalışıyor ve otomatik olarak (koşullarda yukarıda verilen) id = 4 ile kaydını ekler. 2 ve 3 için iki istisna atar ve yakalar.

Bu çözümü beğenmedim, lütfen bana başka bir şey önerin, neredeyse 2 gün boyunca döngü olmadan bir düzeltme arıyorum. Şimdiden teşekkürler. sütun adı ait mağaza işlevi almak maksimum ardından log_id: o zaman

Ör kurtarmak +1 eklemek o sütun maksimum değerini alır böyle bir daha sütun ekleme değer katmak gerekiyorsa

cevap

1

İlk sütun otomatik artış log_id ve +1

$current_id = DB::table('logs')->max('log_id'); 

'log_id' => $current_id + 1, 

yoksa değiştirmek, eklemek senin id kolon tamsayı olarak ve en yüksek değeri al +1

+0

Evet, bu iyi. Ama bu seri veri tipinin yararını öldürecek. Şimdi bu şekilde görelim, Çok büyük bir veritabanında (milyonlarca kayıt), daha verimli ne olurdu? Max ('log_id') + 1; 'ya da 'catch' döngüsünü deneyin? Sanırım en iyisi daha iyi olabilir. –

+0

Sorununuzu çözdünüz mü? – Hamelraj

+0

evet, bu döngüden kaçınılarak, '$ l-> save();' öğesini kaydederek deneyin. ve yakalamada, önerilen yol. –