2011-09-15 30 views
6

diğer varlıkları referans varlıkların toplu işleme ekler Burada anlatılan ederken: sorun benim kod buDoktrini 2: garip davranış ben toplu işlem yöntemini çalışıyorum

$limit = 10000; 
    $batchSize = 20; 
    $role = $this->em->getRepository('userRole')->find(1); 
    for($i = 0; $i <= $limit; $i++) 
    { 
     $user = new \Entity\User; 
     $user->setName('name'.$i); 
     $user->setEmail('email'.$i.'@email.blah'); 
     $user->setPassword('pwd'.$i); 
     $user->setRole($role); 
     $this->em->persist($user); 
     if (($i % $batchSize) == 0) { 
      $this->em->flush(); 
      $this->em->clear(); 
     } 
    } 

benziyor http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/batch-processing.html

olduğunu o ilk çağrıdan sonra> floş() ayrıca $ rol müstakil alır em- ve her 20 kullanıcıları için yeni bir kimliğe sahip yeni bir rol istediğim ne değildir, hangi oluşturulur

Bu durum için mevcut bir çözüm var mı? ı işi İçlerinde tek böylece $role çok müstakil ve müstakil bir varlık devam etmeye çalışıyor,

cevap

14

clear() varlık yöneticisi tarafından yönetilen tüm varlıkları ayırır döngü içinde kullanıcı rolü işletmeye bırakmıştır her zaman getirme

sayesinde etmektir yeni bir varlık oluşturur.

$this->em->clear(); 
$role = $this->em->getRepository('userRole')->find(1); 

Ya da sadece bunun yerine bir referans oluşturmak:

Sen berrak sonra tekrar rol alıp gerektiğini

$this->em->clear(); 
$role = $this->em->getReference('userRole', 1); 
1

Bir alternatif olarak en size cevap arnaud576875 için den $ user koparabildler varlık yöneticisi, hemen GC'd olabilir. böylece gibi:

$this->em->flush(); 
$this->em->detach($user); 

Düzenleme:
olarak bu sadece en son oluşturulan kullanıcı nesneyi ayırmak olacaktır Geoff tarafından işaret etti. Yani bu yöntem önerilir. Ben ne kadar pahalı birleştirme() emin değilim

if (($i % $batchSize) == 0) { 
    $this->em->flush(); 
    $this->em->clear(); 
    $this->em->merge($role); 
} 

- Tahmin olsaydı, ben Arnaud önerisi ile gitmek istiyorum:

+1

kullanarak, yalnızca en son kullanıcıyı ayırırdı, ancak ilerleyen 19'u değil - yanılıyorsam beni düzelt. –

+0

@Geoff lanet, bence haklısın. Cevabımı düzenler. –

0

diğer alternatif merge berrak sonra geri rolü etmektir getReference()

+0

teşekkürler, bunu da deneyeceğim – bazo