Multiple Entity Managers not working Symfony 3 - symfony

I want to use multiple entity manager but it is not working.
config.yml
# Doctrine Configuration
doctrine:
dbal:
default_connection: default
connections:
default:
driver: pdo_mysql
host: '%database_host%'
port: '%database_port%'
dbname: '%database_name%'
user: '%database_user%'
password: '%database_password%'
charset: UTF8
abc_1819:
driver: pdo_mysql
host: '%database_host%'
port: '%database_port%'
dbname: '%database_name1819%'
user: '%database_user%'
password: '%database_password%'
charset: UTF8
orm:
default_entity_manager: default
entity_managers:
default:
connection: default
mappings:
AppBundle: ~
abc_1819:
connection: abc_1819
mappings:
Units:
is_bundle: false
type: annotation
dir: '%kernel.project_dir%/src/AppBundle/Entity'
prefix: 'AppBundle\Entity\Units'
If i use doctrine commands
php bin/console doctrine:database:create
php bin/console doctrine:database:create --connection=abc_1819
php bin/console doctrine:schema:update --force
php bin/console doctrine:schema:update --force --em=abc_1819
it working fine and create the database and table
UnitsController
In the controller default manager working by all methods
$entityManager = $this->getDoctrine()->getManager();
$entityManager = $this->getDoctrine()->getManager('default');
$entityManager = $this->get('doctrine.orm.default_entity_manager');
but the abc_1819 manager not working by using any of methods
$entityManager = $this->getDoctrine()->getManager('abc_1819');
$entityManager = $this->get('doctrine.orm.abc_1819_entity_manager');
it show the following error why ?
Oops! An Error Occurred
The server returned a "500 Internal Server Error".
Something is broken. Please let us know what you were doing when this error occurred. We will fix it as soon as possible. Sorry for any inconvenience caused.
I find the issue when i run project using
php bin/console server:run
it is working fine
But when i try to use http://localhost/abc/web/units/ then its not working

Related

Symfony wrong persist database working with two entity managers

I have the same symfony app deployed in two servers.
I use two entity managers, one called defaul with a connection on "local" database and the other called online on the "remote" database
doctrine:
dbal:
default_connection: default
connections:
default:
driver: pdo_mysql
host: '%database_host%'
port: '%database_port%'
dbname: '%database_name%'
user: '%database_user%'
password: '%database_password%'
charset: UTF8
online:
driver: pdo_mysql
host: '%database_host2%'
port: '%database_port2%'
dbname: '%database_name2%'
user: '%database_user2%'
password: '%database_password2%'
charset: UTF8
orm:
auto_generate_proxy_classes: "%kernel.debug%"
default_entity_manager: default
entity_managers:
default:
dql:
string_functions:
GROUP_CONCAT: AppBundle\DQL\GroupConcatFunction
connection: default
mappings:
LexikTranslationBundle: ~
AppBundle: ~
LilWorksStoreBundle: ~
online:
connection: online
mappings:
AppBundle: ~
LilWorksStoreBundle: ~
I copy some entities from the remote database to the local app within a service. My service get the two entity managers
services:
app.syncro:
class: AppBundle\Service\Syncro
arguments: ['#doctrine.orm.default_entity_manager','#doctrine.orm.online_entity_manager']
I clone the remote entity and I try to persist it in my local
$user = $this->emRemote->getRepository("AppBundle:User")->find(1);
$clonedUser = clone $user;
$this->emLocal->persist($clonedUser->cloneUser());
$this->emLocal->flush();
The flush don't persist in the local database but try to persist in the distant.
Is something in my configuration doesn't works? Maybe my entity still have the remote database name stored in proxy?

How to create a Second database connection with Symfony2?

I'm trying to connect a second database to my project in Symfony2. First, I added into parameters.yml some parameters to create the connection.
Then, I edited my config.yml, and now looks like:
doctrine:
dbal:
default_connection: default
connections:
default:
driver: pdo_mysql
host: "%database_host%"
port: "%database_port%"
dbname: "%database_name%"
user: "%database_user%"
password: "%database_password%"
charset: UTF8
circutor3:
driver: pdo_sqlsrv
host: "%database_host_circutor3%"
port: "%database_port_circutor%"
dbname: "%database_name_circutor%"
user: "%database_user_circutor3%"
password: "%database_password_circutor3%"
charset: UTF8
orm:
auto_generate_proxy_classes: "%kernel.debug%"
naming_strategy: doctrine.orm.naming_strategy.underscore
auto_mapping: true
Finally, I tried to get connected, using the following code in my controller:
$em = $this->getDoctrine()->getManager('circutor3');
And, the error returned by Symfony2:
Doctrine ORM Manager named "circutor3" does not exist.
The circutor3 makes connection to a database, external to my system, so I don't need to create entities or objects. I only need to execute some SELECT to get information and store it using an array.
Is creating a typical mysqli connection the best way to solve my problem?
I don't know how to solve this with Symfony.
Thank you in advance.
you could access to the database connection in the controller as follow:
$connection = $this->getDoctrine()->getConnection('circutor3');
then use the connection as:
$stmt = $connection->prepare($sql);
$stmt->execute();
return $stmt->fetchAll();
Some help here and here
Hope this help
According to Symfony documentation (http://symfony.com/doc/current/cookbook/doctrine/multiple_entity_managers.html), you only defined a connection, not an entity manager :
You have to create an entity_manager for each connection.
orm:
default_entity_manager: default
entity_managers:
default:
...
circutor3:
connection: circutor3
mappings:
AppBundle: ~

How to have DBAL's setSQLLogger in symfony

I was able to connect to doctrine in symfony2, this way:
# Doctrine Configuration
doctrine:
dbal:
default_connection: default
connections:
default:
driver: "%database_driver%"
host: "%database_host%"
port: "%database_port%"
dbname: "%database_name%"
user: "%database_user%"
password: "%database_password%"
charset: UTF8
mapping_types:
enum: string
orm:
auto_generate_proxy_classes: false
proxy_namespace: Proxies
proxy_dir: Proxies
default_entity_manager: default # The first defined is used if not set
entity_managers:
default:
connection: default
mappings: # Required
ApplicationUserBundle:
type: annotation
class_metadata_factory_name: Doctrine\ORM\Mapping\ClassMetadataFactory
dql:
datetime_functions:
UNIX_TIMESTAMP: DoctrineExtensions\Query\Mysql\UnixTimestamp
Now my question is that how to have this in configuration above?
$config->setSQLLogger(new Doctrine\DBAL\Logging\EchoSQLLogger());
I mean another way than this. As this is a $config method I guess that should be possible to have it in config.yml, but how?
You need to fill few config parameters
In doctrine.yaml config file enable logging
doctrine:
dbal:
logging: true
In services.yaml config file set logger class
services:
doctrine.dbal.logger:
class: Doctrine\DBAL\Logging\EchoSQLLogger
Do not forget to clean Symfony cache before usage php bin/console cache:clear

Symfony2 Multiple databases configuration/connections and entity managers

I want to connect another database to my project and link it to my bundle.
There is my configuration for the database connection :
# Doctrine Configuration in app/config/config.yml
doctrine:
dbal:
default_connection: default
connections:
default:
driver: %database_driver%
host: %database_host%
port: %database_port%
dbname: %database_name%
user: %database_user%
password: %database_password%
charset: UTF8
forum:
driver: %database_driver2%
host: %database_host2%
port: %database_port2%
dbname: %database_name2%
user: %database_user2%
password: %database_password2%
charset: UTF8
orm:
default_entity_manager: default
entity_managers:
default:
connection: default
mappings:
ProjectBackBundle: ~
ProjectFrontBundle: ~
ProjectUsersBundle: ~
forum:
connection: forum
mappings:
ProjectForumBundle: ~
The second database (forum) already exists and I check the connection informations.
When I go to the website I have this error :
Unrecognized field: usernameCanonical
There are the command I execute in order to generate de mapping :
php app/consolde doctrine:mapping:convert xml src/Project/ForumBundle/Resources/config/doctrine/metadata/orm --from-database --force --em="forum"
But this command is infinite, it is not executed. Why ? Did I miss something ?
From the error message, you are probably using FOSUserBundle, and you have to tell it which entity manager to use, just like your own bundles. Your configuration for your 'default' entity manager should look like this:
default:
connection: default
mappings:
ProjectBackBundle: ~
ProjectFrontBundle: ~
ProjectUsersBundle: ~
FOSUserBundle: ~

How can I specify the database to reverse engineer?

I'm following this guide on reverse engineering a database. The guide says it uses the paramters.yml file for the database parameters, but how can I override this? I have several connections listed in my config.yml, and I'd like to be able to choose one of them.
Use the --em parameter to specify which entity manager you want to use.
doctrine:mapping:convert [--filter="..."] [--force] [--from-database] [--extend[="..."]] [--num-spaces[="..."]] [--namespace[="..."]] [--em[="..."]] to-type dest-path
If you assign each Doctrine connection to its own Entity Manager, then you can specify the entity manager with the --em="entity_manager_name" flag. However, you will have to manually map each bundle to an entity manager. In the following example config, the other connection and entity manager are named customer
$ php app/console doctrine:mapping:convert yml ./src/Acme/CustomerBundle/Resources/config/doctrine/metadata/orm --em="customer" --from-database --force
config.yml
# Doctrine Configuration
doctrine:
dbal:
default_connection: default
connections:
default:
driver: %database_driver%
host: %database_host%
port: %database_port%
dbname: %database_name%
user: %database_user%
password: %database_password%
charset: UTF8
customer:
driver: %database_driver2%
host: %database_host2%
port: %database_port2%
dbname: %database_name2%
user: %database_user2%
password: %database_password2%
charset: UTF8
orm:
default_entity_manager: default
entity_managers:
default:
connection: default
mappings:
AcmeDemoBundle: ~
AcmeStoreBundle: ~
customer:
connection: customer
mappings:
AcmeCustomerBundle: ~

Resources