2012-04-26 27 views
5

Tôi mới dùng Doctrine, mongo và thiết lập ODM và trong khi chơi với thiết lập này trong ZF1 Tôi đang cố gắng tái tạo một tham chiếu đơn giản hạn chế. Đây là tình huống và muốn một số lời khuyên về cách đạt được điều này.Học thuyết ODM MongoDB - Tái tạo một Tham chiếu Một đến Nhiều với Hạn chế

Đây là một user- đơn giản> vai trò lập bản đồ, vì vậy trong một tình huống sql tôi sẽ có bảng như sau:

 
Users 
- id 
- name 
- role_id 

Roles 
- id 
- name 

Sau đó, một ràng buộc khoá ngoại sẽ được đặt trên những người sử dụng ROLE_ID để ánh xạ vai trò ID. Và khi xóa một vai trò, một ràng buộc khoá ngoại sẽ được kích hoạt để dừng hoạt động.

Làm cách nào để đạt được cùng một mục tiêu trong Doctrines MongoDB ODM?

Cho đến nay tôi đã chơi với các loại chú thích khác nhau trên thực thể tài khoản bao gồm @ReferenceOne @ReferenceMany với các tùy chọn khác nhau thác ...

Sự lựa chọn trái với tôi bây giờ là thực hiện @PreUpdate, @PreRemove sự kiện vòng đời trên thực thể 'vai trò' và sau đó kiểm tra xem không có người dùng nào đang sử dụng vai trò, nếu họ đang trên cập nhật, thay đổi tham chiếu để khớp hoặc loại bỏ sẽ loại bỏ một ngoại lệ.

Tôi có ở đây hoặc bị mất không?

Cảm ơn bạn,

Si

Trả lời

7

Đối với một cái gì đó như thế tôi sẽ không có hai 'bảng' riêng biệt như bạn sẽ trong SQL. Bạn sẽ chỉ có loại vai trò làm tài sản của người dùng. Và sau đó nếu bạn muốn loại bỏ một loại vai trò, bạn chỉ có thể thao tác với trường vai trò của tất cả người dùng với vai trò đó.

Nhưng để trả lời câu hỏi của bạn, tôi sẽ làm như vậy.

<?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(); 
    } 
} 

Sau đó, tôi sẽ tạo một lớp dịch vụ để làm việc với người quản lý tài liệu của mình.

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

Câu trả lời hay, cảm ơn bạn rất nhiều! –

+1

Không sao cả. Tôi đã trải qua cùng một nỗi đau như bạn khi bắt đầu với Doctrine. Thật tuyệt vời một khi bạn nhận được hang của nó mặc dù! –

+1

Tôi nghĩ rằng nó thực sự tốt cho đến nay. Nó làm cho việc xây dựng một tầng dịch vụ trên đầu dễ dàng hơn rất nhiều. Một điểm nhỏ là tôi Roles :: hasUsers() sẽ trả về! $ This-> users-> isEmpty(); để đảo ngược boolean. Cảm ơn rất nhiều vì sự giúp đỡ của bạn và điều này hoạt động như một giấc mơ. –

Các vấn đề liên quan