Symfony 从ODM(文档,MongoDB)中引用ORM(实体),并具有多个关系

Symfony 从ODM(文档,MongoDB)中引用ORM(实体),并具有多个关系,symfony,orm,doctrine,mapping,doctrine-odm,Symfony,Orm,Doctrine,Mapping,Doctrine Odm,我试图在symfony2.6中结合ODM(MongoDB)和ORM,并参考文档 我有两个实体,User和Category。我还有一个文档产品 很明显,当混合ODM和ORM时,它可以通过一种情况或多种情况轻松解决-一方面我们定义引用一个链接+两个field指定identifier=“fieldId”和fieldId本身,另一方面我们定义ReferenceMany) 我的挑战是让$product->categories填充多个关系。到目前为止,当填写$product->userId时,$produc

我试图在symfony2.6中结合ODM(MongoDB)和ORM,并参考文档

我有两个实体,
User
Category
。我还有一个文档
产品

很明显,当混合ODM和ORM时,它可以通过一种情况或多种情况轻松解决-一方面我们定义引用一个链接+两个
field
指定
identifier=“fieldId”
fieldId
本身,另一方面我们定义ReferenceMany)

我的挑战是让
$product->categories
填充多个关系。到目前为止,当填写
$product->userId
时,
$product->user
被正常检索。但是我不能用
$product->categories
实现同样的效果

你能帮我找到解决办法吗

/** 
 * @ORM\Entity
 * @ORM\Table(name="users")
 */
class User
{
    /**
     * @var ArrayCollection $products
     * 
     * @Gedmo\ReferenceMany(type="document", class="Document\Product", mappedBy="user")
     */
    protected $products;
}

/** 
 * @Gedmo\Tree(type="nested")
 * @ORM\Entity
 * @ORM\Table(name="categories")
 */
class Category
{
    /**
     * @var ArrayCollection $products
     * 
     * @Gedmo\ReferenceMany(type="document", class="Document\Product", mappedBy="products")
     */
    protected $products;
}
然后我有一份文件

/**
 * @MongoDB\Document
 * @MongoDB\HasLifecycleCallbacks
 */
class Product
{
    /**
     * @Gedmo\ReferenceOne(type="entity", class="Entity\User", inversedBy="products", identifier="userId")
     */
    protected $user;

    /**
     * @MongoDB\Field(name="user_id", type="int")
     */
    protected $userId;

    /**
     * @Gedmo\ReferenceMany(type="entity", class="Entity\Category", mappedBy="products")
     */
    protected $categories = array();

    /**
     * @MongoDB\Collection
     */
    protected $categoryIds = array();

    public function getUser()
    {
        return $this->user;
    }

    public function getCategories()
    {
        return $this->categories;
    }
}


p.S>侦听器
gedmo.listener.reference
utils.listener.reference
确实存在。

条令提供了该用例的实际文档:

它基本上是一个手动实现的学说的参考模型。简而言之:您将一个id(或id列表)存储在一个属性中,该属性通过条令进行映射和持久化

然后在加载过程中(通过事件侦听器或方法注释),获取相应的文档并将它们存储在单独的属性中。然后在刷新过程中(通过事件侦听器或方法注释),获取(可能已更改)对象的id并将其放回第一个属性中

多年来,我们一直在我们的核心产品中使用这种方法的稍加修改的版本,它工作良好,没有任何问题,而且非常透明


更奇怪的是:也可以(从长远来看更难但更方便)为此构建一个自定义的条令类型。

到目前为止,我不得不使用存储在文档中的CategoryId数组引入加载类别的自定义解决方案。对于持久化也是一样,我正在PrePersist上更新Ids数组。但仍然在寻找一个优雅的解决方案。我在我的原始帖子中没有提到这一点,但实际上我指的是现有的文档“混合了ORM和MongoDB ODM”。这就是为什么我以“我正在尝试混合…”开始我的信息,我将把它添加到我原来的帖子中。我正在使用“categoryIds”属性并通过自定义EventSubscriber订阅事件。但我希望有另一种方法,就像教条所做的那样。好吧,正如我所提到的,你可以通过定制的方式来实现