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()
).
$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.
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).
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'));
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);
}
}
Vous pouvez également utiliser Doctrine_RawSql (); pour créer des requêtes SQL brutes qui s'hydrateront en objets doctrine.
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);