2014-07-10 24 views
7

Doktrin varlığımdaki bir değeri artırmak istiyorum.
Şu anda bunu yapıyorum. Doktrin Varlık artış değeri (İndirme sayacı)

$file->setDownloadCounter($file->getDownloadCounter() + 1); 
$em = $this->getDoctrine()->getManager(); 
$em->persist($fileVersion); 
$em->flush(); 

doktrininde böyle bir şey yürütmek için bir yolu var mı:

UPDATE file SET downloadCounter = downloadCounter + 1 WHERE id = 1 

DÜZENLEME: Yukarıdaki doktrin örnekte sorun yükleme ve floş arasındaki zaman başkaları olduğunu

olduğunu dosyayı indirebilir ve sayaç doğru değildir.

cevap

7

Ayrıca bir varlık depoda aşağıdakileri yapabilirsiniz: DQL

return $this 
    ->createQueryBuilder('f') 
    ->update($this->getEntityName(), 'f') 
    ->set('f.downloadCounter', $file->getDownloadCounter() + 1) 
    ->where('f.id = :id')->setParameter('id', $file->getId()) 
    ->getQuery() 
    ->execute(); 

Veya kullanarak:

$em = $this->getDoctrine()->getManager(); 
$query = $em->createQuery(
    'UPDATE YourBundle:File f 
     SET f.downloadCounter = f.downloadCounter + 1' 
); 
:
$em = $this->getDoctrine()->getManager(); 
$query = $em->createQuery(
    'UPDATE YourBundle:File f 
     SET f.downloadCounter = :downloadCounter' 
)->setParameter('downloadCounter', $file->getDownloadCounter() + 1); 

Ya basitleştirilmiş DQL aracılığıyla

Bu çözümlerle ilgili dezavantaj: Varlığınız zaten yüklenmişse, önceki sayıma göre artırılmış sayıya sahip olmaz.

Yaptığınız yöntem gayet iyi ama daha iyi bir yol, varlığınıza bir artış yöntemi eklemektir.

+0

Teşekkürler, DQL'iniz bana yardımcı oldu. ': downloadCounter' yerine 'f.downloadCounter + 1 'kullandı ve dosya kimliği –

+0

için bir yer ekledim. Örnek olarak ekledim - cevabım yararlı oldu –

+6

bir cevap değil, soru nasıl yapılır artımlı sorgulama, +1 –

3

Modelinize yalnızca bir arttırma yöntemi ekleyebilirsiniz.

class File { 
    public function increaseDownloadCounter() 
    { 
     $this->downloadCounter++; 
    } 
} 
-1
$em = $this->getDoctrine()->getManager(); 

$entity = $em->getRepository('AcmeDemoBundle:EntityName')->find($entityId); 
$valueToIncrement = $entity->getMyField(); // where MyField is the DB field to increment 
$entity->setMyField(++$valueToIncrement); 

$em->persist($entity); 
$em->flush(); 
+0

İki yaklaşım daha az eşzamanlı istek olduğunda bu yaklaşım başarısız olur - arttırma sadece bir kez yapılır. – Casey

+0

Yarış koşulları için eğilimli. – Kaspars

İlgili konular