2012-04-26 15 views
5

olan birçok Referans basit One Çoğalt kısıtlama. İşte durum ve bunun nasıl gerçekleştirileceğine dair bazı tavsiyelerde bulunmak istiyorum. Ben tablolar olurdu bir sql durumda böyleceDoktrin ODM MongoDB - Doktrin, Mongo'da ve ODM kurulumu konusunda yeniyim ve ZF1 bu kurulum ile oynarken ben birçok referansa basit bir çoğaltmak için çalışıyorum Kısıtlama

Bu basit bir kullanıcı-> rol haritalama, aşağıdaki gibidir:

 
Users 
- id 
- name 
- role_id 

Roles 
- id 
- name 

Sonra yabancı anahtar kısıtlaması olan kullanıcılar atanabilir

role haritaya ROLE_ID İD. Ve bir rolü sildikten sonra, operasyonu durduran bir yabancı anahtar kısıtlaması tetiklenecektir.

nasıl Öğretiler MongoDB ODM aynı hedefe elde edebiliriz? Şimdiye kadar farklı kaskad seçenekleri ile @ReferenceOne @ReferenceMany dahil, kullanıcı varlık üzerinde farklı ek açıklama türleri ile oynamıştır

...

seçim bana şimdi sol @PreUpdate, @PreRemove yaşam döngüsü olaylarını uygulamaktır

ve 'rol' varlık üzerinde sonra onlar güncelleme değişikliği ardından maç veya kaldır üzerinde bir özel durum için referans ise hiçbir kullanıcı, rol kullandığınızdan emin olun.

Tam burada veya kayıp mıyım?

Eğer SQL yazar gibi ben iki ayrı 'tabloları' olmazdı böyle bir şey için,

Si

cevap

7

teşekkür ederiz. Sadece rolün türünün bir özelliği olarak sahip olursunuz. Daha sonra bir rol türünü kaldırmak istediyseniz, bu rolle tüm kullanıcıların rol alanını değiştirebilirsiniz.

sorunuzun cevabı Ama, bu kadar gibi yapardı.

<?php 
class User { 
    /** @MongoDB\Id */ 
    protected $id; 
    /** @MongoDB\String */ 
    protected $name; 
    /** @MongoDB\ReferenceOne(targetDocument="Role", mappedBy="user") */ 
    protected $role; 

    //Getters/Setters 
} 

class Role { 
    /** @MongoDB\Id */ 
    protected $id; 
    /** @MongoDB\String */ 
    protected $name; 
    /** @MongoDB\ReferenceMany(targetDocument="User", inversedBy="role") */ 
    protected $users; 

    public function _construct() { 
     $this->users = new Doctrine\Common\Collections\ArrayCollection; 
    } 
    // Getters/Setters 

    public function hasUsers() { 
     return !$this->users->isEmpty(); 
    } 
} 

Daha sonra belge yöneticimle çalışmak için bir hizmet sınıfı oluştururdum.

class RoleService { 
    public function deleteRole(Role $role) { 
     if (!$role->hasUsers()) { 
      // Setup the documentManager either in a base class or the init method. Or if your über fancy and have php 5.4, a trait. 
      $this->documentManager->remove($role); 
      // I wouldn't always do this in the service classes as you can't chain 
      // calls without a performance hit. 
      $this->documentManager->flush(); 
     } 
    } 
} 
+0

Güzel cevap, çok teşekkür ederim! –

+1

Sorun değil. Doktrin ile başlarken seninle aynı acıyı yaşadım. Yine de asıldığın zaman harika! –

+1

Bence gerçekten çok iyi. En üstte bir servis katmanı oluşturmayı çok daha kolay hale getirir. Bir küçük nokta ise: Roles :: hasUsers() 'ın geri dönmesi gerekiyor! $ This-> users-> isEmpty(); boolean'ı tersine çevirmek için. Yardımlarınız için çok teşekkürler ve bu bir rüya gibi çalışır. –

İlgili konular