2012-03-11 15 views
17

Symfony 2 kitabının güvenlik bölümünü izliyorum.Çoktan çoğa tablodaki kayıt silme

Tablo USERS ve GROUPS ile bir örnek var. , USERS ve GROUPS arasında USERGROUPS arası bir tablo oluşturur ve USERGROUPS adlı veritabanında bir tablo oluşturur. Benim istediğim

örneğin USERGROUPS bir kaydı silmek için:

DELETE from USERGROUPS WHERE user_id = 1 and group_id = 1 

Ben bir USERGROUPS.php tablo dosyası olmadığı için bunun nasıl bilmiyorum. DQL kullanma

, örneğin, bunu yapmak mümkün istiyorum:

$em = $this->getDoctrine()->getEntityManager(); 
$query = $em->createQuery(
    'DELETE FROM AcmeStoreBundle:UserGroups ug WHERE ug.user_id = :user 
    and ug.group_id = :group' 
)->setParameter(array('user' => $userid, 'group' => $groupid)); 

Ben anladınız umarım.

Sonra, bu tablodan nasıl kaldırabilirim?

cevap

17

Doktrin, veriler hakkında tablo satırları yerine, nesne olarak düşünür. Yani, Doktrin terimlerinde, Grup nesneleri (Grubun kullanıcılarını, diğer şeylerin yanında tutan) vardır ve Kullanıcı nesneleri (her biri, kullanıcının bulunduğu Grupları depolayan bir özelliği vardır) vardır. Fakat hiçbir UserGroup nesnesi yok. Doktrin (ve herhangi bir ORM sistemi) fikri, geliştiricinin veritabanının ihtiyaç duyabileceği ancak programın nesne modeli açısından gerekli olmadığı bu ara tabloları unutmasına izin vermektir.

Yapmak istediğiniz şey, ilgili Kullanıcı nesnesini yüklemek, grubu $ grupları özelliğinden kaldırmak ve değiştirilen Kullanıcı nesnesini sürdürmektir. (Ya da tersi, yani ilgili Grup nesnesini yükleyin ve Kullanıcıyı buradan kaldırın.) DQL bunu halledebilir, ancak DQL'in DELETE ifadesi tüm nesneleri silmek için olduğu gibi DQL olmadan bunu yapmak daha kolaydır. özelliklerini değiştirerek.

Dene:

Not
$user = $em->find('User', $userId); 
$user->removeGroup($groupId); //make sure the removeGroup method is defined in your User model. 
$em->persist($user); 
$em->flush(); //only call this after you've made all your data modifications 

: Eğer (Ben Symfony'nin sizin için bir tane üretebilir düşünüyorum, ama yanlış olabilir) Kullanıcı modelinde bir removeGroup() yöntemini yoksa, yöntem olabilir aşağıdaki gibi görün.

//In User.php, and assuming the User's groups are stored in $this->groups, 
//and $groups is initialized to an empty ArrayCollection in the User class's constructor 
//(which Symfony should do by default). 

class User 
{ 
    //all your other methods 

    public function removeGroup($group) 
    { 
     //optionally add a check here to see that $group exists before removing it. 
     return $this->groups->removeElement($group); 
    } 
} 
+0

Ethan her iki taraftan remove yöntemleri çağırmak zorunda. Çok teşekkür ederim! Çalıştı :) Neden symfony bu yöntemi otomatik olarak oluşturmadı? Birçok masadan bir şeyleri silmek için çok yaygın bir görev olduğuna inanıyorum. –

+0

Evet, her zaman neden symfony'nin de (addMethods oluşturduğundan) yöntemleri kaldırmadığını merak ettim. Memnun kaldım! – Ethan

+3

Bu kullanıcıyla ilgili çoktan çoğa masada 1.000.000 kayıt varsa ve yalnızca birini silmem gerekiyorsa ne olur? Doktrin tüm kayıtları yükleyecek mi? –

4

@ Ethan'ın yanıtına ek olarak, tek yönlü kaldırma çalışmaz. Böyle manyToMany ilişki için, örneğin

$user = $em->findOneById($userId); 
$group = $em->findOneById($groupId); 

$user->removeGroup($group); 
$group->removeUser($user); 

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

Çözümünüzün Tablodan Sil eşdeğeri col1 = ve col2 = mu? Birleştirilmiş Tabloda sorgu yapar mı? – Volatil3

+0

Böyle görünüyor – Sithu