从ODM(文档,MongoDB)引用ORM(实体)与ManyToMany关系



我正在尝试在我的Symfony 2.6中混合ODM(MongoDB)和ORM,并参考文档"混合ORM和MongoDB ODM">

我有两个实体,UserCategory。我也有一个文件Product.

很明显,当混合 ODM 和 ORM 时,它可以通过 OneToMany 或 ManyToOne 案例轻松解决 - 一方面我们定义 ReferenceOne 链接 +field指定identifier="fieldId"fieldId本身,另一方面我们定义 ReferenceMany)。

我的挑战是让$product->categories充满关系 ManyToMany。到目前为止,当$product->userId填满时,$product->user正常检索。但我无法用$product->categories实现相同的目标.

你能帮我找到解决方案吗?

/** 
* @ORMEntity
* @ORMTable(name="users")
*/
class User
{
/**
* @var ArrayCollection $products
* 
* @GedmoReferenceMany(type="document", class="DocumentProduct", mappedBy="user")
*/
protected $products;
}
/** 
* @GedmoTree(type="nested")
* @ORMEntity
* @ORMTable(name="categories")
*/
class Category
{
/**
* @var ArrayCollection $products
* 
* @GedmoReferenceMany(type="document", class="DocumentProduct", mappedBy="products")
*/
protected $products;
}

然后我有一个文档

/**
* @MongoDBDocument
* @MongoDBHasLifecycleCallbacks
*/
class Product
{
/**
* @GedmoReferenceOne(type="entity", class="EntityUser", inversedBy="products", identifier="userId")
*/
protected $user;
/**
* @MongoDBField(name="user_id", type="int")
*/
protected $userId;
/**
* @GedmoReferenceMany(type="entity", class="EntityCategory", mappedBy="products")
*/
protected $categories = array();
/**
* @MongoDBCollection
*/
protected $categoryIds = array();
public function getUser()
{
return $this->user;
}
public function getCategories()
{
return $this->categories;
}

}

附言>听众gedmo.listener.referenceutils.listener.reference确实存在。

原则提供了该用例的实际文档:

混合ORM和MongoDB ODM

它基本上是教义参考模型的手动实现。简而言之:您将 id(或 id 列表)存储在通过原则映射和持久化的属性中。

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

多年来,我们一直在核心产品中使用这种方法的略微修改版本,它工作正常,没有任何打嗝,而且非常透明。

对于更好奇的人:也有可能(从长远来看更难,但更方便)为此构建一个自定义的学说类型。

相关内容

最新更新