41 votes

Utilisation de SQL brut avec Doctrine

J'ai quelques requêtes extrêmement complexes qu'il faut utiliser pour générer un rapport dans mon application. Je suis à l'aide de symfony que mon cadre et la doctrine comme mon ORM.

Ma question est la suivante:

Quel est le meilleur moyen de passer de très complexe des requêtes sql directement à la Doctrine, sans les convertir à la Doctrine Query Language? J'ai lu à propos de l' Raw_SQL extension, mais il semble que vous avez encore besoin de passer la requête dans les sections (comme from()). Est-il quelque chose de simplement le dumping un tas de matières premières commandes sql?

51voto

Tom Points 10295
 $q = Doctrine_Manager::getInstance()->getCurrentConnection();
$result = $q->execute(" -- RAW SQL HERE -- ");
 

Consultez la documentation de l'API Doctrine pour connaître différentes méthodes d'exécution.

39voto

richsage Points 12266

Oui. Vous pouvez obtenir un descripteur de base de données auprès de Doctrine à l'aide du 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 gérer les résultats renvoyés sous forme de tableau, composé d'un tableau par ligne renvoyée (valeur-clé en tant que valeur-colonne).

6voto

takeshin Points 16579

Je ne suis pas sûr de comprendre ce que vous voulez dire par 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);
     }
}
 

6voto

Twelve47 Points 2682

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

6voto

Nikola Petkanski Points 1197

Il est à noter que Doctrine2 utilise PDO comme base. Par conséquent, je recommanderais d'utiliser des instructions préparées par rapport à un simple exécutable.

Exemple:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X