2010-05-05 8 views
40

Ho alcune query estremamente complesse che devo utilizzare per generare un report nella mia applicazione. Sto usando symfony come framework e dottrina come il mio ORM.Utilizzo di SQL raw con Doctrine

mia domanda è questa:

Qual è il modo migliore per passare query SQL altamente complesse direttamente a Dottrina senza convertirli in Query Language dottrina? Ho letto sull'estensione Raw_SQL ma sembra che sia ancora necessario passare la query in sezioni (come from()). C'è qualcosa solo per il dumping in un gruppo di comandi sql raw?

+0

Scusi l'off-topic, ma quale strumento/biblioteca stai usando per generare i report di applicazione? Cordiali saluti! –

+2

In questo momento? Solo SQL, PHP raw e gall. : D –

risposta

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

Vedere la documentazione API dottrina per i diversi metodi di esecuzione.

+0

Funziona anche per l'aggiornamento del file ??? – simple

+0

@simple: Sì, è possibile utilizzare qualsiasi SQL che si desidera. – Tom

+7

Dato che questa risposta sembra essere popolare, dovrei aggiungere che questo metodo ignora l'escaping offerto da Doctrine, in modo tale che si possa eseguire l'escape manualmente o lasciarlo aperto ai buchi di SQL injection. – Tom

38

Sì. È possibile ottenere una maniglia database dalla Dottrina utilizzando il seguente codice:

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

e quindi eseguire il vostro SQL come segue:

variabili
$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(); 

È possibile utilizzare legati come nell'esempio di cui sopra.

Nota che Doctrine non automaticamente idraterà i tuoi risultati in oggetti record, ecc. valore).

+0

Esiste un modo per forzare la dottrina ad idratare i risultati ottenuti tramite il PDO? o devo solo lavorare con quello che mi viene dato? –

+0

Dalla memoria quando ho usato quanto sopra, non automaticamente come Doctrine non sa quali colonne hai. Se hai nominato le colonne abbastanza bene, suppongo che potresti utilizzare fromArray() o simili, ma i dati dovrebbero essere riformattati in qualcosa di utile per questo. – richsage

+0

Se è possibile, utilizzare la query per restituire un ID record e quindi utilizzare plain $ table-> find ($ id) per caricarlo. – lotsoffreetime

6

non sono sicuro che cosa si intende dicendo SQL prime, ma si sono trascurabili eseguire query SQL tradizionali in questo modo:

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

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

Il seguente metodo non è necsessary, ma dimostra una buona pratica.

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

È inoltre possibile utilizzare Doctrine_RawSql(); per creare query SQL raw che si idratino in oggetti dottrinali.

6

Va notato che Doctrine2 usa PDO come base, quindi raccomanderei di usare istruzioni preparate su semplici vecchi esecuzioni.

Esempio:

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

Questa domanda riguarda Symfony 1. Su Symfony 1, Doctrine 1.2 è usato - Questa risposta potrebbe essere fuorviante. – xmc

+0

Scusa, non volevo ingannare. La soluzione è ancora valida anche se Symfony 1 può essere usato anche con Doctrine. –

+1

+1 per l'utilizzo di esempio della preparazione della query. –

0

Symfony SQL insert grezzo utilizzando dottrina.

Questa versione Symfoney 1,3

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