web-dev-qa-db-fra.com

Utilisation de SQL brut avec Doctrine

J'ai des requêtes extrêmement complexes que je dois utiliser pour générer un rapport dans mon application. J'utilise symfony comme framework et doctrine comme ORM.

Ma question est la suivante:

Quelle est la meilleure façon de passer directement des requêtes SQL très complexes à Doctrine sans les convertir en Doctrine Query Language? J'ai lu sur le L'extension Raw_SQL Mais il semble que vous ayez encore besoin de passer la requête dans des sections (comme from()).

41
Levi Hackwith
$q = Doctrine_Manager::getInstance()->getCurrentConnection();
$result = $q->execute(" -- RAW SQL HERE -- ");

Voir la documentation de l'API Doctrine pour les différentes méthodes d'exécution.

50
Tom

Oui. Vous pouvez obtenir un descripteur de base de données à partir de Doctrine en utilisant le code suivant:

$pdo = Doctrine_Manager::getInstance()->getCurrentConnection()->getDbh();

puis exécutez votre SQL comme suit:

$query = "SELECT * FROM table WHERE param1 = :param1 AND param2 = :param2";
$stmt = $pdo->prepare($query);

$params = array(
  "param1"  => "value1",
  "param2"  => "value2"
);
$stmt->execute($params);

$results = $stmt->fetchAll();  

Vous pouvez utiliser des variables liées comme dans l'exemple ci-dessus.

Notez que Doctrine n'hydratera pas automatiquement vos résultats en objets d'enregistrement, etc., vous devrez donc traiter les résultats renvoyés sous forme de tableau, composé d'un tableau par ligne renvoyée (clé -value comme valeur de colonne).

39
richsage

Il convient de noter que Doctrine2 utilise PDO comme base, donc je recommanderais d'utiliser des instructions préparées par rapport à une exécution ancienne.

Exemple:

$db = Doctrine_Manager::getInstance()->getCurrentConnection();
$query = $db->prepare("SELECT `someField` FROM `someTable` WHERE `field` = :value");
$query->execute(array('value' => 'someValue'));
6
Nikola Petkanski

Je ne sais pas ce que vous voulez dire SQL brut, mais vous pouvez exécuter les requêtes SQL traditionnelles de cette façon:

... 
// $this->_displayPortabilityWarning();

$conn = Doctrine_Manager::connection();
$pdo = $conn->execute($sql);
$pdo->setFetchMode(Doctrine_Core::FETCH_ASSOC);
$result = $pdo->fetchAll();
...

La méthode suivante n'est pas nécessaire, mais elle montre une bonne pratique.

protected function _displayPortabilityWarning($engine = 'pgsql')
{
     $conn = Doctrine_Manager::connection();
     $driver = $conn->getDriverName();

     if (strtolower($engine) != strtolower($driver)) {
        trigger_error('Here we have possible database portability issue. This code was tested on ' . $engine . ' but you are trying to run it on ' . $driver, E_USER_NOTICE);
     }
}
6
takeshin

Vous pouvez également utiliser Doctrine_RawSql (); pour créer des requêtes SQL brutes qui s'hydrateront en objets doctrine.

6
Twelve47

Symfony insère SQL brut en utilisant la doctrine.

Ceci dans la version Symfoney 1.3

$q = Doctrine_Manager::getInstance()->getCurrentConnection();
$result = $q->execute($query);
0
SMSM