Nota
Este artículo es sobre la capa DBAL de Doctrine. Normalmente, vas a trabajar con el nivel superior de la capa ORM de Doctrine, la cual simplemente utiliza DBAL detrás del escenario para comunicarse realmente con la base de datos. Para leer más sobre el ORM de Doctrine, consulta «Bases de datos y Doctrine».
Doctrine la capa de abstracción de base de datos (DataBase Abstraction Layer — DBAL) es una capa que se encuentra en la parte superior de PDO y ofrece una API intuitiva y flexible para comunicarse con las bases de datos relacionales más populares. En otras palabras, la biblioteca DBAL facilita la ejecución de consultas y realización de otras acciones de base de datos.
Truco
Lee la documentación oficial de DBAL para conocer todos los detalles y las habilidades de la biblioteca DBAL de Doctrine.
Para empezar, configura los parámetros de conexión a la base de datos:
# app/config/config.yml
doctrine:
dbal:
driver: pdo_mysql
dbname: Symfony2
user: root
password: null
charset: UTF8
<!-- app/config/config.xml -->
<doctrine:config>
<doctrine:dbal
name="default"
dbname="Symfony2"
user="root"
password="null"
driver="pdo_mysql"
/>
</doctrine:config>
// app/config/config.php
$container->loadFromExtension('doctrine', array(
'dbal' => array(
'driver' => 'pdo_mysql',
'dbname' => 'Symfony2',
'user' => 'root',
'password' => null,
),
));
Para ver todas las opciones de configuración DBAL, consulta Configurando DBAL de Doctrine.
A continuación, puedes acceder a la conexión Doctrine DBAL accediendo al servicio database_connection:
class UserController extends Controller
{
public function indexAction()
{
$conn = $this->get('database_connection');
$users = $conn->fetchAll('SELECT * FROM users');
// ...
}
}
Puedes registrar tipos de asignación personalizados a través de la configuración de Symfony. Ellos se sumarán a todas las conexiones configuradas. Para más información sobre los tipos de asignación personalizados, lee la sección Tipos de asignación personalizados de la documentación de Doctrine.
# app/config/config.yml
doctrine:
dbal:
types:
custom_first: Acme\HelloBundle\Type\CustomFirst
custom_second: Acme\HelloBundle\Type\CustomSecond
<!-- app/config/config.xml -->
<container xmlns="http://symfony.com/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:doctrine="http://symfony.com/schema/dic/doctrine"
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd
http://symfony.com/schema/dic/doctrine http://symfony.com/schema/dic/doctrine/doctrine-1.0.xsd">
<doctrine:config>
<doctrine:dbal>
<doctrine:type name="custom_first" class="Acme\HelloBundle\Type\CustomFirst" />
<doctrine:type name="custom_second" class="Acme\HelloBundle\Type\CustomSecond" />
</doctrine:dbal>
</doctrine:config>
</container>
// app/config/config.php
$container->loadFromExtension('doctrine', array(
'dbal' => array(
'types' => array(
'custom_first' => 'Acme\HelloBundle\Type\CustomFirst',
'custom_second' => 'Acme\HelloBundle\Type\CustomSecond',
),
),
));
La SchemaTool se utiliza al inspeccionar la base de datos para comparar el esquema. Para lograr esta tarea, es necesario saber qué tipo de asignación se debe utilizar para cada tipo de la base de datos. Por medio de la configuración puedes registrar nuevos tipos.
Vamos a asociar el tipo ENUM (por omisión no apoyado por DBAL) al tipo string:
# app/config/config.yml
doctrine:
dbal:
connections:
default:
// otros parámetros de conexión
mapping_types:
enum: string
<!-- app/config/config.xml -->
<container xmlns="http://symfony.com/schema/dic/services"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:doctrine="http://symfony.com/schema/dic/doctrine"
xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd
http://symfony.com/schema/dic/doctrine http://symfony.com/schema/dic/doctrine/doctrine-1.0.xsd">
<doctrine:config>
<doctrine:dbal>
<doctrine:dbal default-connection="default">
<doctrine:connection>
<doctrine:mapping-type name="enum">string</doctrine:mapping-type>
</doctrine:connection>
</doctrine:dbal>
</doctrine:config>
</container>
// app/config/config.php
$container->loadFromExtension('doctrine', array(
'dbal' => array(
'connections' => array(
'default' => array(
'mapping_types' => array(
'enum' => 'string',
),
),
),
),
));