如何使用映射的超类更改Doctrine ODM中的引用?

时间:2016-08-09 12:50:50

标签: php doctrine-odm

我使用的是抽象基类" BaseUser"和两个班级"管理员"和"用户"。 现在用户应该成为管理员。

简单地更改鉴别器字段是有效的,但是在其他集合中有很多引用,因为该文档是"用户"。 因此," admin"找不到=> NotFoundException

是否有一个简单的解决方案将班级从用户切换到管理员更新所有参考文件?

BaseUser

 /**
 * @ODM\Document
 * @ODM\InheritanceType("SINGLE_COLLECTION")
 * @ODM\DiscriminatorField("type")
 * @ODM\DiscriminatorMap({"admin"="Admin", "user"="User"})
 * @ODM\MappedSuperclass
 */
abstract class BaseUser { ... }

管理

/**
 * @ODM\Document
 */
class Admin extends BaseUser {...}

用户

/**
 * @ODM\Document
 */
class User extends BaseUser {...}

示例用户文档:

/* User */
{
    "_id" : ObjectId("123456789123456789"),
    "name" : "John",
    "type" : "user" //changed this to 'admin'
}

另一个文档中的引用(例如BlogPost)

/** BlogPost */
{
    "_id" : ObjectId("abc123456789"),       
    "headline" : "my first post",
    "text" : "lorem ipsum",
    "author" : {
        "$ref" : "BaseUser",
        "$id" : ObjectId("123456789123456789"),
        "type" : "user" //want this to be updated to 'admin' automatically
    }
}

我尝试了什么?

更改字段"输入"在来自值'用户'的用户文档中到' admin'

=>当然参考"作者"在BlogPost中不再有效了。

我可以手动更新所有BlogPosts,但这对我来说似乎非常容易出错。难道没有更好的解决方案来改变这个用户吗?

(上面的代码尽可能简单。实际上没有像博客文章那样简单的东西,但是不同文档类的wndrets指的是我的用户/管理类。所以手动更新似乎真的很难)

0 个答案:

没有答案