Comment utiliser la couche DBAL Doctrine


Table des matières

Référence
Enregistrement des types de mapping personnalisés
Enregistrement des types de mapping personnalisés dans le SchemaTool

Référence

Cet article est d'environ couche Doctrine de DBAL. En règle générale, vous travaillerez avec la doctrine niveau supérieur couche ORM, qui utilise tout simplement la DBAL dans les coulisses pour réellement communiquer avec la base de données. Pour en savoir plus sur l'ORM Doctrine, voir Bases de données et Doctrine ("Le modèle")

La doctrine de base de données Abstraction Layer (DBAL) voir Introduction Symfony2 est une couche d'abstraction qui se trouve sur le dessus de PDO et offre une API intuitive et flexible pour communiquer avec les bases de données relationnelles les plus populaires. En d'autres termes, la bibliothèque DBAL, il est facile d'exécuter des requêtes de bases de données et effectuer des actions d'autres.

Lire la doctrine officielle de documentation DBAL pour apprendre tous les détails et les capacités de la bibliothèque DBAL Doctrine.

Pour commencer, configurer les paramètres de connexion de la base de données:

Version Yaml

# app/config/config.yml
doctrine:
    dbal:
        driver:   pdo_mysql
        dbname:   Symfony2
        user:     root
        password: null
        charset:  UTF8

Version Xml

// app/config/config.xml
<doctrine:config>
    <doctrine:dbal
        name="default"
        dbname="Symfony2"
        user="root"
        password="null"
        driver="pdo_mysql"
    />
</doctrine:config>

Version Php

// app/config/config.php
$container->loadFromExtension('doctrine', array(
    'dbal' => array(
        'driver'    => 'pdo_mysql',
        'dbname'    => 'Symfony2',
        'user'      => 'root',
        'password'  => null,
    ),
));

Pour l'ensemble des options de configuration DBAL, voir Configuration Doctrine DBAL .

Vous pouvez ensuite accéder à la connexion Doctrine DBAL en accédant au service DATABASE_CONNECTION:

class UserController extends Controller
{
    public function indexAction()
    {
        $conn = $this->get('database_connection');
        $users = $conn->fetchAll('SELECT * FROM users');

        // ...
    }
}

Enregistrement des types de mapping personnalisés

Vous pouvez vous inscrire types de cartographie personnalisés grâce à la configuration de Symfony. Ils seront ajoutés à toutes les connexions configurées. Pour plus d'informations sur les types de cartographie personnalisée, lisez Cartographie de base Symfony2 .

Version Yaml

# app/config/config.yml
doctrine:
    dbal:
        types:
            custom_first: Acme\HelloBundle\Type\CustomFirst
            custom_second: Acme\HelloBundle\Type\CustomSecond

Version Xml

<!-- 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>

Version Php

// app/config/config.php
$container->loadFromExtension('doctrine', array(
    'dbal' => array(
        'connections' => array(
            'default' => array(
                'mapping_types' => array(
                    'enum'  => 'string',
                ),
            ),
        ),
    ),
));

Enregistrement des types de mapping personnalisés dans le SchemaTool

Le SchemaTool est utilisé pour inspecter la base de données pour comparer le schéma. Pour réaliser cette tâche, il a besoin de savoir quel type de cartographie doit être utilisé pour chaque type de base de données. Enregistrement de nouvelles peut être fait par la configuration.

Voyons mapper le type ENUM (pas supported par DBAL par défaut) à un type de la chaîne de cartographie:

Version Yaml

# app/config/config.yml
doctrine:
    dbal:
        connections:
            default:
                // Other connections parameters
                mapping_types:
                    enum: string

Version Xml

<!-- 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>

Version Php

// app/config/config.php
$container->loadFromExtension('doctrine', array(
    'dbal' => array(
        'types' => array(
            'custom_first'  => 'Acme\HelloBundle\Type\CustomFirst',
            'custom_second' => 'Acme\HelloBundle\Type\CustomSecond',
        ),
    ),
));