Symfony2 Doctrine DBAL Query Builder with MSSQL - php

I have to work with a real legacy mssql database and I'm trying to use the Doctrine DBAL Query Builder.
FYI I'm on a linux machine with working freetds connection
Until now I tried the https://github.com/realestateconz/MssqlBundle
and configured the database connection like this
doctrine:
dbal:
default_connection: default
connections:
default:
driver_class: Realestate\MssqlBundle\Driver\PDODblib\Driver
host: %database_host%
dbname: %database_name%
user: %database_user%
password: %database_password%
Now I used in the controller
$conn = $this->get('database_connection');
But now when I write $qb = $conn->createQueryBuilder();
it isn't aware of the createQueryBuilder...
Anyone knows a solution?

Related

No transport supports the given Messenger DSN doctrine

I am getting an error No transport supports the given Messenger DSN "doctrine://default" when executing command messenger:setup-transports for Symfony messenger.
Handling messages synchronously for the message, handler, and dispatcher works.
Symfony: 4.4.2
Symfony/messenger: 4.4
doctrine/orm: 2.7
messenger.yml
messenger:
default_bus: messenger.bus.default
transports:
async: 'doctrine://default'
doctrine.yml
doctrine:
dbal:
default_connection: default
connections:
default:
driver: "%database_driver%"
port: "%database_port%"
host: "%database_host%"
dbname: "%database_name%"
user: "%database_user%"
password: "%database_password%"

Connect to Multiple Databases on Different Servers

I have been using Symfony with Doctrine for some time, and up until now was able to configure Doctrine to connect to several databases on the same server (IP), through the config.yml.
But now I have a different scenario.
I am working on a case, that has multiple projects running on different IP adresses. I can connect with the database that runs locally on the machine that also hosts the main application, but now I need to connect to another database that's hosted on another server. So, to lay out this case:
Server Alpha. IP: 193.15.15.15, database name: "Foo"
Server Beta. IP: 193.15.15.16, database name: "Bar"
I have defined the user and password for each of these databases in my parameters.yml, so that is no biggie. I just would like to know if it's possible to connect to the (locally hosted) database on server Beta, while the application is on server Alpha.
Thanks in advance!
You should configure multiple entity managers and connections
On the file config.yml :
doctrine:
dbal:
default_connection: default
connections:
default:
driver: pdo_mysql
host: '193.15.15.15'
port: '%port_parameter_for_foo%'
dbname: 'Foo'
user: '%user_parameter_for_foo%'
password: '%pass_parameter_for_foo%'
charset: UTF8
customer:
driver: pdo_mysql
host: '193.15.15.16'
port: '%port_parameter_for_bar%'
dbname: 'Bar'
user: '%user_parameter_for_bar%'
password: '%pass_parameter_for_bar%'
charset: UTF8
orm:
default_entity_manager: default
entity_managers:
default:
connection: default
mappings:
BundleOnAlpha: ~
customer:
connection: beta
mappings:
BundleOnBeta: ~
The doc is more complete:
https://symfony.com/doc/3.4/doctrine/multiple_entity_managers.html

Cannot connect database oracle with symfony2

what i need
i need to connect oracle database with symfony2.
i have checked by php -m
oci8
pdo_odbc
odbc
here is the link i follow https://gist.github.com/johnkary/6481664
a.)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: "%database_charset%"
b.) parameter.yml
# If connecting via SID
parameters:
database_driver: oci8
database_host: abc
database_port: '1521'
database_name: test
database_user: aa
database_password: aa
database_charset: AL32UTF8
mailer_transport: smtp
mailer_host: 127.0.0.1
mailer_user: null
mailer_password: null
locale: en
secret: zzzz
c.)services.orcale.yml
services:
acme.doctrine.dbal.events.oracle_session_init.listener:
class: %doctrine.dbal.events.oracle_session_init.class%
tags:
- { name: doctrine.event_listener, event: postConnect }
acme.doctrine.dbal.oracle_platform.type_mapping.listener:
class: Acme\MisBundle\Listener\OracleDoctrineTypeMappingListener
tags:
- { name: doctrine.event_listener, event: postConnect }
then run symfony database cmd
php bin/console doctrine:database:create
error:
cannot create database test for connection named default.
notice: undefined index dbname
i have googled a day but i think there are few developer who works with symfony2 and oracle.
i had made simple php script that works to test connections
$userName = ""; $password = ""; $dtabasePort = "1521"; $serverName = "";
$databaseName = "testingdb";
$c = oci_connect($userName, $password, '(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = host)(PORT = 1521)) (CONNECT_DATA = (SERVICE_NAME = ) (SID =)))');
print_r($c);
output
Resource id #3
tsnames.ora
test=
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = sss)(PORT = 1521))
(CONNECT_DATA = (SID = test))
)
i have worked sf3 and mysql but im new to oracle thats why i don"t knew how to connect oracle db with symfony.
please give some solution where i have done wrong.
Can anyone suggest in steps how to connect oracle db with sf2/3 is most appreciated.
link of github relies same issue that im facing https://github.com/doctrine/dbal/issues/1564
i have also changed the parameter.yml file
parameters:
database_driver: oci8
database_user: <user>
database_password: <password>
database_charset: WE8MSWIN1252
database_name: (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=<host>)(PORT=<port>))(CONNECT_DATA=(SERVICE_NAME=<service_name>)))
then error you have requested non-existence parameter "database_host"
last & final solution i tried but didn"t worked i think there bug in sf2 for oracle
parameters:
database_driver: oci8
database_host:
database_port: 1521
database_name:
database_user:
database_password:
domain_name:
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
persistent: true
orm:
auto_generate_proxy_classes: "%kernel.debug%"
auto_mapping: true
services:
pdo:
class: PDO
arguments:
- "oci8:Server=%database_host%;Database=%database_name%"
- "%database_user%"
- "%database_password%"
calls:
- [setAttribute, [3, 2]] # \PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION
session.handler.pdo:
class: ESERV\MAIN\FrameworkChanges\MtlPdoSessionHandler
arguments: ["#pdo", "%pdo.db_options%"]
here is what I use to connect MSSQL : https://github.com/realestateconz/MssqlBundle
config.yml :
doctrine:
dbal:
types:
string: ***\BacsManagementBundle\Type\StringType
default_connection: default
connections:
default:
host: "%database_host%"
dbname: "%database_name%"
user: "%database_user%"
password: "%database_password%"
driver_class: Realestate\MssqlBundle\Driver\PDODblib\Driver
mapping_types:
enum: string
string: string
hope it helps.
This might be a little old but I think it is still useful. I am working on a Symfony 5 project connected to a legacy Oracle 11G database. For the most part Doctrine works fine. In some cases you need to perform a raw query.
Your env file:
DATABASE_URL2="oci8://USERNAME:PASSWORD#HOSTNAME:1521/DATABASENAME"
Note: if you are using Oracle 11G Express Edition your database name most likely will be XE
Next update your doctrine.yaml file. In my case I have two databases. The default one is MySQL and the 2nd database is Oracle 11G. It would also be a good idea to install the DoctrineExtensions package that gives a little more support to Oracle and MySQL in Doctrine.
doctrine:
dbal:
default_connection: default
connections:
default:
# configure these for your database server
url: '%env(resolve:DATABASE_URL)%'
driver: 'pdo_mysql'
server_version: '5.7'
charset: utf8mb4
mapping_types:
enum: string
default_table_options:
charset: utf8mb4
collate: utf8mb4_unicode_ci
oracle:
# configure these for your database server
url: '%env(resolve:DATABASE_URL2)%'
driver: 'oci8'
server_version: '11'
charset: AL32UTF8
orm:
auto_generate_proxy_classes: '%kernel.debug%'
default_entity_manager: default
entity_managers:
default:
naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware
connection: default
auto_mapping: true
dql:
numeric_functions:
rand: DoctrineExtensions\Query\Mysql\Rand
datetime_functions:
DATE_FORMAT: DoctrineExtensions\Query\Mysql\DateFormat
mappings:
App:
is_bundle: false
type: annotation
dir: '%kernel.project_dir%/src/Entity'
prefix: 'App\Entity'
alias: App
oracle:
naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware
connection: oracle
dql:
datetime_functions:
TO_CHAR: DoctrineExtensions\Query\Oracle\ToChar
TO_DATE: DoctrineExtensions\Query\Oracle\ToDate
mappings:
Oracle:
is_bundle: false
type: annotation
dir: '%kernel.project_dir%/src/Entity/Oracle'
prefix: 'App\Entity\Oracle'
alias: Oracle
Now this is where it gets tricky. My database does not have any primary keys so I had to add them manually to each table in order to import the entities. Once I imported the entities I then removed the primary keys and updated the entities manually.
php bin/console doctrine:mapping:import "App\Entity\Oracle" annotation --path=src/Entity/Oracle --em=oracle
You should now be able to use Doctrine to perform a query. I like using repositories so I do not use Query Builder.
Example:
public function getEmployeeInfo($clientID)
{
$sql =
"
SELECT
p.employeeId,
p.clientId,
p.firstname,
p.lastname
FROM
Oracle:Phoneext p
WHERE
p.clientId = :clientID
ORDER BY p.lastname ASC
"
;
$query = $this->getEntityManager()->createQuery($sql);
$query->setParameter('clientID', $clientID);
$results = $query->getResult();
return ($results);
}
In a case you need to perform a RAW query:
public function getMultiStatusRowId($employeeID, $status, $date, $time, $em)
{
$conn = $em->getConnection();
$sql =
"
SELECT
ROWIDTOCHAR(ROWID) as row_id
FROM
MULTI_STATUS
WHERE
EMPLOYEE_ID = ?
AND STATUS = ?
AND IN_DATE = ?
AND IN_TIME = ?
ORDER BY ORDER_NUM ASC
"
;
$result = $conn->prepare($sql);
$result->bindValue(1, $employeeID);
$result->bindValue(2, $status);
$result->bindValue(3, $date);
$result->bindValue(4, $time);
$result->execute();
$data = array();
$i = "0";
while ($row = $result->fetch()) {
$data[$i]['ROW_ID'] = $row['ROW_ID'];
$i++;
}
return $data;
}
One final item if you need help setting up a local system on a Mac you can use this to help setup Lando. Note I had to setup Oracle 11G on AWS EC2 then was able to use the IMP tool to import my dump files.
If you setup RDS Amazon will default to Oracle 20 or some newer version. AWS RDS does not support the older backups from IMP. RDS will only support data pump using S3.
https://github.com/rsaylor73/lando-apache-php-mysql-oci8

Doctrine connection with db

I am about to start a project in doctrine symfony, but I have to make connection with multiple databases. One of them is an existing database (SQL SERVER) that cannot be mapped with ORM. Is there any possibility to connect with this db with another db that is NOT mapped in doctrine and work with controllers normally?
I develop a multi-database sf2 app with doctrine2 orm mapping.
We use intellectsoft-uk/MssqlBundle
Our configuration is:
config.yml
# Doctrine Configuration
doctrine:
dbal:
default_connection: acme_mysql
connections:
acme_mysql:
host: %acme_mysql_database_host%
port: %acme_mysql_database_port%
dbname: %acme_mysql_database_name%
user: %acme_mysql_database_user%
password: %acme_mysql_database_password%
charset: UTF8
acme_slqsrv:
driver: sqlsrv
driver_class: \Realestate\MssqlBundle\Driver\PDODblib\Driver
host: %acme_slqsrv%
port: %acme_slqsrv%
dbname: %acme_slqsrv%
user: %acme_slqsrv%
password: %acme_slqsrv%
charset: UTF8
orm: #optional if you want to map some entity in doctrine2
auto_generate_proxy_classes: %kernel.debug%
default_entity_manager: acme_mysql
entity_managers:
em_mysql:
connection: acme_mysql
mappings:
AcmeMysqlBundle: ~
em_sqlsrv:
connection: acme_sqlsrv
mappings:
AcmeSqlSrvBundle: ~
This configuration permit you to take a connection instance in a controller/service and use it for access database and execute stored procedures and so on...
Hope this help

Symfony2 + Propel: no connection information

I'm trying to connect propel and symfony2 together, but the only thing that I get is this exception:
No connection information in your runtime configuration file for datasource [symfony]
I used the propel bundle which I added to the composer, and I edited the kernel to include the bundle.
My config.yml propel conf looks like that:
propel:
dbal:
driver: mysql
user: root
password: null
dsn: mysql:host=localhost;dbname=symfony;charset=UTF8
options: {}
attributes: {}
What can I be missing? I tried googling, but nothing really solves the issue.
Okay, I solved the issue.
The problem lied in the config.yml file, where the propel dbal data should be stored. I initially put it the way they describe it in the manual, like that:
propel:
dbal:
driver: "%database_driver%"
user: "%database_user%"
password: "%database_password%"
dsn: "%database_driver%:host=%database_host%;dbname=%database_name%;charset=%database_charset%"
According to the manual on both the propel and symfony's sites, it is enough. However, this doesn't seem to be the case for some reason yet unknown to me. What I had to do was to explicitly state the connection and name it precisely - symfony, like that:
propel
dbal:
default_connection: symfony
connections:
symfony:
driver: %database_driver%
user: %database_user%
password: %database_password%
dsn: %database_driver%:host=%database_host%;dbname=%database_name%;charset=UTF8
This way it worked. Sucks to be a junior developer sometimes.

Categories