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