5

我是 Doctrine、mongo 和 ODM 设置的新手,在 ZF1 中使用此设置时,我试图复制一个带有约束的简单一对多引用。这是情况,想就如何实现这一点提出一些建议。

这是一个简单的用户->角色映射,因此在 sql 情况下,我将有如下表:

用户
 - ID
 - 姓名
 - role_id

角色
 - ID
 - 姓名

然后将在用户 role_id 上设置外键约束以映射到角色 id。并且在删除角色后,将触发外键约束来停止操作。

我怎样才能在 Doctrines MongoDB ODM 中实现相同的目标?

到目前为止,我已经在 User 实体上使用了不同类型的注释,包括具有不同级联选项的 @ReferenceOne @ReferenceMany ...

现在留给我的选择是在“角色”实体上实现@PreUpdate、@PreRemove 生命周期事件,然后检查是否没有用户正在使用该角色,如果他们在更新时将引用更改为匹配或在删除时抛出异常.

我在这里还是迷路了?

谢谢,

4

1 回答 1

7

对于这样的事情,我不会像在 SQL 中那样有两个单独的“表”。您只需将角色类型作为用户的属性。然后,如果您想删除一个角色类型,您可以操纵具有该角色的所有用户的角色字段。

但要回答你的问题,我会这样做。

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

然后我会创建一个服务类来使用我的文档管理器。

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();
        }
    }
}
于 2012-04-26T22:56:23.020 回答