Utilisation du SQL brut avec la Doctrine

j'ai quelques requêtes extrêmement complexes qu'il faut utiliser pour générer un rapport dans mon application. J'utilise symfony comme cadre et doctrine comme ORM.

Ma question est la suivante:

Quelle est la meilleure façon de passer dans les requêtes sql très complexes directement à la Doctrine sans les convertir au langage de requête de la Doctrine? J'ai lu sur le 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 pour juste jeter dans un tas de commandes SQL brutes?

40
demandé sur Levi Hackwith 2010-05-05 20:13:57

6 réponses

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

voir la documentation de L'API Doctrine pour différentes méthodes d'exécution.

49
répondu Tom 2010-05-05 21:46:04

Oui. Vous pouvez obtenir une poignée de base de données de Doctrine en utilisant le code suivant:

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

et ensuite exécuter 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 la Doctrine ne va pas automatiquement hydrater vos résultats en objets d'enregistrement etc, donc vous aurez besoin de traiter les résultats étant retournés comme un tableau, composé d'un tableau par ligne retournée (valeur clé comme colonne-Valeur).

39
répondu richsage 2010-05-05 18:01:33

Je ne suis pas sûr de ce que vous voulez dire par "dire"!--3 -- > raw SQL, mais vous pouvez exécuter des 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
répondu takeshin 2010-05-05 20:51:37

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

6
répondu Twelve47 2010-06-03 13:34:36

il est à noter que Doctrine2 utilise PDO comme base, donc je recommande d'utiliser des déclarations préparées plutôt que de simples vieilles exécutions.

Exemple:

$db = Doctrine_Manager::getInstance()->getCurrentConnection();
$query = $db->prepare("SELECT `someField` FROM `someTable` WHERE `field` = :value");
$query->execute(array('value' => 'someValue'));
6
répondu Nikola Petkanski 2011-12-08 14:08:46

Symfony insérer raw sql à l'aide de la doctrine.

Cela dans la version Symfoney 1.3

$q = Doctrine_Manager::getInstance()->getCurrentConnection();
$result = $q->execute($query);
0
répondu SMSM 2013-01-19 09:58:34