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
Related
I need to connect to an external database, I just need to do a simple query in one table so I think I dont need to create an new entity manager. I believe all configurations are set up correctly but I still don't get connected to the new database. So i´m missing something but cant find what, here are my files:
# 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
# if using pdo_sqlite as your database driver:
# 1. add the path in parameters.yml
# e.g. database_path: '%kernel.root_dir%/data/data.db3'
# 2. Uncomment database_path in parameters.yml.dist
# 3. Uncomment next line:
#path: '%database_path%'
database2:
driver: pdo_mysql
host: '%database2_host%'
port: '%database2_port%'
dbname: '%database2_name%'
user: '%database2_user%'
password: '%database2_password%'
charset: UTF8
orm:
auto_generate_proxy_classes: '%kernel.debug%'
naming_strategy: doctrine.orm.naming_strategy.underscore
auto_mapping: true
parameters:
#Set_Goals Database
database_host: 127.0.0.1
database_port: null
database_name: set_goals
database_user: root
database_password: null
#Database2 Database
database2_host: 127.0.0.1
database2_port: null
database2_name: second
database2_user: root
database2_password: null
Repository:
public function getAccounts(){
$conn = $this->getEntityManager()->getConnection('database2');
$sql = 'SELECT * FROM leme_account';
$stmt = $conn->prepare($sql);
$stmt->execute();
return $stmt->fetchAll();
}
Error:
An exception occurred while executing 'SELECT * FROM leme_account':
SQLSTATE[42S02]: Base table or view not found: 1146 Table 'set_goals.leme_account' doesn't exist
set_goals database is the default connection.
Thanks in advance and sorry if I´m missing something really simple here but I´m new to Symfony and programming in general and I followed the documentation and also some related questions here but can´t make it work.
I think you need to create another entity manager
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
# if using pdo_sqlite as your database driver:
# 1. add the path in parameters.yml
# e.g. database_path: '%kernel.root_dir%/data/data.db3'
# 2. Uncomment database_path in parameters.yml.dist
# 3. Uncomment next line:
#path: '%database_path%'
database2:
driver: pdo_mysql
host: '%database2_host%'
port: '%database2_port%'
dbname: '%database2_name%'
user: '%database2_user%'
password: '%database2_password%'
charset: UTF8
orm:
auto_generate_proxy_classes: '%kernel.debug%'
naming_strategy: doctrine.orm.naming_strategy.underscore
auto_mapping: true
default_entity_manager: default
entity_managers:
default:
connection: default
database2:
connection: database2
Then in your code
$em = $this->get('doctrine')->getManager();
$em2 = $this->get('doctrine')->getManager('database2');
The documentation mentions a mappings key but I don't know if it is mandatory, especially since you are using auto mapping.
Ref: https://symfony.com/doc/2.8/doctrine/multiple_entity_managers.html
Meanwhile, I found the problem.... it was a newb mistake. I was putting my method inside the repository of the other entity. When I added directly to the controller it worked.
Thanks for your answers.
I'm trying to use an Xhprof bundle in conjunction with XhGUI. I've have two separate databases for my app, one for the actual domain models(postgres) and one to store the profiling data(mysql).
I've created two connections and entity managers in the my config.yml to account for this. I'm having trouble with the mapping now though because two of my bundles have entities that extend entities in 3rd party bundles. The configurations/annotations found in the base classes isn't being picked up by doctrine though. The 3rd party bundles use annotations for the orm configuration so in my classes that extend those, i chose annotation as well.
MyCompanyAuthBundle has entities that extend entities in the FOSOAuthServerBundle bundle. MyCompanyProfileBundle has one entity that extends an entity in the JnsXhprofBundle bundle.
Now that i'm having to manually configure the mappings sections in my config.yml, i can't figure out how to tell doctrine to also use the entities base class annotation configuration found in the 3rd party bundles.
Before i started trying to use two connections, i just used the auto_mapping flag in the orm config and it worked great with my single connection.
Anyone know what i'm doing wrong here?
Here is the doctrine part of my config.yml.
doctrine:
dbal:
default_connection: default
connections:
default:
driver: "%database_driver%"
host: "%database_host%"
port: "%database_port%"
dbname: %database_name%_%kernel.environment%
user: "%database_user%"
password: "%database_password%"
charset: UTF8
xhprof:
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:
MyCompanyCoreBundle: ~
MyCompanyAuthBundle:
type: annotation
xhprof:
connection: xhprof
mappings:
MyCompanyProfileBundle: ~
JnsXhprofBundle: ~
Figured it out. Easier than i expected!
Just needed to add the bundles that also have mapping.
My working config.yml
doctrine:
dbal:
default_connection: default
connections:
default:
driver: "%database_driver%"
host: "%database_host%"
port: "%database_port%"
dbname: %database_name%_%kernel.environment%
user: "%database_user%"
password: "%database_password%"
charset: UTF8
xhprof:
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:
MyCompanyCoreBundle: ~
MyCompanyAuthBundle: ~
FOSOAuthServerBundle: ~
xhprof:
connection: xhprof
mappings:
MyCompanyProfileBundle: ~
JnsXhprofBundle: ~
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: ~
I am trying to set up my symfony to use two databases connections. The problem is that Symfony won't map the Entities to the right EntityManager. So perform a query, I have to tell Symfony what manager it should use.
My config:
# 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
lookup:
driver: "%database_driver%"
host: "%database_host%"
port: "%database_port%"
dbname: "Lookup"
user: "%database_user%"
password: "%database_password%"
charset: UTF8
orm:
auto_generate_proxy_classes: "%kernel.debug%"
default_entity_manager: default
entity_managers:
default:
connection: default
mappings:
MbMyAppBundle: ~
mvibes:
mappings:
MbLookupBundle: ~
connection: mvibes
So, to query from my Lookup, i have to do: $this->getDoctrine()->getRepository('MbLookupBundle:Country', 'lookup');
Instead, I was hoping I could leave out the second parameter. This way, my bundle would be independent. The project manager can decide what database config he will implement in his project. He'll just have to make sure that the mapping is correct.
How does this work? What are the mappings used for, if this is not possible?
You have mistakes in connections naming :
# Doctrine Configuration
doctrine:
dbal:
default_connection: default
connections:
default:
# ...
mvibes: #This is the name of the connection
# ...
orm:
auto_generate_proxy_classes: "%kernel.debug%"
default_entity_manager: default
entity_managers:
default:
connection: default
mappings:
MbMyAppBundle: ~
mvibes:
mappings:
MbLookupBundle: ~
connection: mvibes #must refre to a connection's name defined above
Official doc : http://symfony.com/doc/current/cookbook/doctrine/multiple_entity_managers.html
A blog post I wrote about it : http://blog.alterphp.com/2011/10/configuration-trick-for-multiple-entity.html
I had 5 minutes ago a full setup with FOS userBundle which was working. Then i decided to use multiple / shared db connections. And now i've got :
MyNamespace\UserBundle\Entity\User is not a valid entity or mapped super class.
Here's the setting.
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
shared:
driver: %database_shared_driver%
host: %database_shared_host%
port: %database_shared_port%
dbname: %database_shared_name%
user: %database_shared_user%
password: %database_shared_password%
charset: UTF8
orm:
auto_generate_proxy_classes: %kernel.debug%
default_entity_manager: default
entity_managers:
default:
connection: default
mappings:
MyNonSharedBundle: ~
shared:
connection: shared
mappings:
MyUserBundle: ~
FOSUserBundle: ~
PS: If i Move MyUserBundle and FosUserBundle under the default connection, it works.
That means something is trying to work with your entity through default entity manager. Did you configure FOSUserBundle?
fos_user:
model_manager_name: "shared"