Как правильно реализовать связь сущностей в Symfony2, используя Doctrine и, наверное, разные entity managers?

Схема ассоциаций сущностей:

Product many-to-one Category
Product one-to-many Tag

Нужно, чтобы работала такая схема:
для Product и Category используется Doctrine EntityManager
а для Tag использовать свой ObjectManager

Хотелось бы услышать способы реализации.

P.S.
Отдельный ObjectManager нужен для того, чтобы доставать данные не непосредственно из БД, а из другого источника, например Memcache или файла
  • Вопрос задан
  • 2833 просмотра
Пригласить эксперта
Ответы на вопрос 2
BoShurik
@BoShurik Куратор тега Symfony
Symfony developer
Можно подгружать теги через postLoad (docs.doctrine-project.org/en/2.0.x/reference/event...
Ответ написан
Комментировать
если собиратесь делать join-ы из разных БД, то Doctrine позволяет сделать это: Cross Database Joins

не везде прямо говорится о том, что join не будет работать при нескольких EntityManager, только при одном, который получится при работе auto_mapping: true

для этого прописываете в настройках config.yml:
doctrine:
   dbal:
        default_connection: main_db
        connections:
            main_db:
                driver:   "%database_users_driver%"
                host:     "%database_users_host%"
                port:     "%database_users_port%"
                dbname:   "%database_users_name%"
                user:     "%database_users_user%"
                password: "%database_users_password%"
                charset:  UTF8
            other_db:
                driver:   "%database_driver%"
                host:     "%database_host%"
                port:     "%database_port%"
                dbname:   "%database_name%"
                user:     "%database_user%"
                password: "%database_password%"
                charset:  UTF8
    orm:
        auto_generate_proxy_classes: %kernel.debug%
        auto_mapping: true


чтобы все заработало надо не забыть указать имена таблиц при определении Entity в формате "db_name.table_name", например:
/**
 * Product
 *
 * @ORM\Table(name="main_db.Product")
 * @ORM\Entity(repositoryClass="AcmeBundle\Entity\ProductRepository")
 * 
 */
class Product
{ ....


после этого в своем EntityRepository спокойно себе формируете dql-запрос типа такого:

$sql = "SELECT p FROM AcmeBundle:Product p JOIN p.tag t WHERE ... ORDER BY ...";
query = $this->_em->createQuery($sql)->setParameters(array(...));
return $query->getResult();
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы