2016-12-29 15 views
1

Я пытаюсь смешать ODM (MongoDB) и ORM в моем Symfony 2.6 со ссылкой на Документации "Blending ORM and MongoDB ODM"Reference ORM (Entity) от ODM (Документ, MongoDB) с ManyToMany отношений

У меня есть две сущности, User и Category. Также у меня есть один документ Product.

Это ясно, когда смешивание ODM и ОРМ, он может быть легко решена с OneToMany или ManyToOne случае - с одной стороны, мы определяем ReferenceOne ссылку + как fieldidentifier="fieldId" и задав сам fieldId, на другой стороне мы определяем ReferenceMany).

Мой вызов получает $product->categories населенный с отношением ManyToMany. До сих пор $product->user извлекается нормально, когда заполняется $product->userId. Но я не могу добиться такого же результата с $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 действительно существуют.

+0

До сих пор мне приходилось вводить пользовательское решение с загрузкой категорий, используя массив категорий категорий, который хранится в документах. То же самое для сохранения, я обновляю массив Ids на PrePersist. Но все еще ищет элегантное решение. –

ответ

2

Существует фактическая документация для этого случая использования представленной доктриной:

Blending the ORM and MongoDB ODM

Это в основном ручная реализация эталонной модели доктрины в. Короче: вы храните идентификатор (или список идентификаторов) в свойстве, которое отображается и сохраняется через доктрину.

Затем во время процесса загрузки (через прослушиватель событий или аннотации методов) вы получаете соответствующие документы и сохраняете их в отдельном свойстве. Затем во время процесса очистки (через прослушиватель событий или аннотации методов) вы получаете (возможно, измененные) объекты (ы) объектов и помещаете их обратно в свое первое свойство.

Мы используем слегка измененную версию этого подхода в нашем основном продукте уже много лет, и он отлично работает, без каких-либо икота и очень прозрачно.

Для более любопытных: также возможно (и сложнее, но более удобно в конечном итоге) построить для них собственный тип доктрины.

+0

Я не упомянул об этом в своем оригинальном посте, но на самом деле я имел в виду существующую документацию «Смешивание ORM и MongoDB ODM». Вот почему я начал свое сообщение с «Я пытаюсь смешать ...» Я добавлю его в свое первоначальное сообщение. Я использую свойство categoryIds и подписываюсь на события через пользовательский EventSubscriber. Но я надеялся, что есть еще один способ, как это сделала Доктрина. –

+0

Ну, как я уже упоминал, вы могли бы пройти маршрут нестандартного типа для этого – Jan