Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to manage Doctrine queries with multiple db schemas

I have an entity A with a relation ManyToOne with B but A and B doesn't belong to the same DB schema.

Entity 'A' belongs to MyBundle bundle, and entity 'B' belongs to MyOtherBundle bundle.

The official documentation explain how to work with different connections : multiple schemas = multiple entity manager. But in my case I would like to join both entities.

By doing :

$this->objEm->getRepository('MyBundle:MyEntity')->find($id);

or

$this->objEm->getRepository('MyBundle:MyEntity')->getMyResult($id);

I only call one of my repository, and I guess he's not able to get the other because in my config.yml I can chose only one connection.

doctrine:
  dbal:
   connections:
     connection1:
       driver:   "%database_driver%"
       host:     "%database_host%"
       port:     "%database_port%"
       dbname:   "%database_name%"
       user:     "%database_schema1_user%"
       password: "%database_schema1_password%"
       service:  "%database_service%"
       charset:  "Windows-1252"
     connection2:
       driver:   "%database_driver%"
       host:     "%database_host%"
       port:     "%database_port%"
       dbname:   "%database_name%"
       user:     "%database_schema2_user%"
       password: "%database_schema2_password%"
       service:  "%database_service%"
       charset:  "Windows-1252"

orm:
  entity_managers:
    em1:
      connection:       connection1
      mappings:
              MyBundle: ~
              MyOtherBundle: ~
    em2:
      connection:       connection2
      mappings:
              MyOtherBundle: ~

Result : Whoops, looks like something went wrong.

1/1ReflectionException: Class FQCN\Of\MyBundle\Entity\B does not exist ...

"I know it doesn't exist dude, I want you to look at the good place now : like at FQCN\Of\MyOtherBundle\Entity\B"

How can I force the path to my entity 'B'?

like image 429
user1913526 Avatar asked Dec 18 '12 17:12

user1913526


2 Answers

If your schema are in the same database, then just define the tables for the entities as

Bundle\Entity\Class:
    type: entity
    table: schema.class

(yaml)

You won't need to specify a second connection. When the schema is explicitly indicated, these joins work perfectly in doctrine 2.

If your schema are in different databases, you are in for some misery, because each and every join will query both databases; for multiple record joins each entry will perform a join meaning you do a number of queries proportional to the number of objects in your result set (BAD).

like image 158
Lighthart Avatar answered Sep 28 '22 17:09

Lighthart


Problem solved ! It had absolutely nothing to do with databases schema nor annotations.

In entity A, one of my personnal setter was forcing type in parameter :

public function setB(B $objB) { //... }

... and I forgot to use B's FQCN ! That's why it was using A's one.

Next time I won't declare FQCN in the annotation to oblige me to use it at the beginning of my class ! :)

like image 45
user1913526 Avatar answered Sep 28 '22 18:09

user1913526