Risposte:
Ecco un esempio di una query grezza in Doctrine 2 che sto facendo:
public function getAuthoritativeSportsRecords()
{
$sql = "
SELECT name,
event_type,
sport_type,
level
FROM vnn_sport
";
$em = $this->getDoctrine()->getManager();
$stmt = $em->getConnection()->prepare($sql);
$stmt->execute();
return $stmt->fetchAll();
}
...getConnection()->query($sql);
e non dovevo correre$stmt->execute();
EntityManagerInterface $entityManager
e poi chiamare$entityManager->getConnection()
//$sql - sql statement
//$em - entity manager
$em->getConnection()->exec( $sql );
L'ho fatto funzionare in questo modo, supponendo che tu stia usando PDO.
//Place query here, let's say you want all the users that have blue as their favorite color
$sql = "SELECT name FROM user WHERE favorite_color = :color";
//set parameters
//you may set as many parameters as you have on your query
$params['color'] = blue;
//create the prepared statement, by getting the doctrine connection
$stmt = $this->entityManager->getConnection()->prepare($sql);
$stmt->execute($params);
//I used FETCH_COLUMN because I only needed one Column.
return $stmt->fetchAll(PDO::FETCH_COLUMN);
Puoi modificare FETCH_TYPE in base alle tue esigenze.
Collegati al tuo manager e crea una nuova connessione:
$manager = $this->getDoctrine()->getManager();
$conn = $manager->getConnection();
Crea la tua query e fetchAll:
$result= $conn->query('select foobar from mytable')->fetchAll();
Ottieni i dati dal risultato in questo modo:
$this->appendStringToFile("first row foobar is: " . $result[0]['foobar']);
Ho scoperto che la risposta è probabilmente:
Una NativeQuery ti consente di eseguire SQL nativo, mappando i risultati secondo le tue specifiche. Tale specifica che descrive come un set di risultati SQL viene mappato a un risultato di Doctrine è rappresentata da un ResultSetMapping.
Fonte: SQL nativo .
Ho avuto lo stesso problema. Vuoi guardare l'oggetto connessione fornito dal gestore entità:
$conn = $em->getConnection();
È quindi possibile eseguire query / eseguire direttamente su di esso:
$statement = $conn->query('select foo from bar');
$num_rows_effected = $conn->exec('update bar set foo=1');
Vedere la documentazione per l'oggetto connessione su http://www.doctrine-project.org/api/dbal/2.0/doctrine/dbal/connection.html
Nel tuo modello crea l'istruzione SQL grezza (l'esempio sotto è un esempio di un intervallo di date che ho dovuto usare ma ho sostituito il tuo. Se stai facendo un SELECT aggiungi -> fetchall () alla chiamata execute ().
$sql = "DELETE FROM tmp
WHERE lastedit + INTERVAL '5 minute' < NOW() ";
$stmt = $this->getServiceLocator()
->get('Doctrine\ORM\EntityManager')
->getConnection()
->prepare($sql);
$stmt->execute();
Non puoi, Doctrine 2 non consente query grezze. Può sembrare che tu possa farlo, ma se provi qualcosa del genere:
$sql = "SELECT DATE_FORMAT(whatever.createdAt, '%Y-%m-%d') FORM whatever...";
$em = $this->getDoctrine()->getManager();
$em->getConnection()->exec($sql);
Doctrine sputerà un errore dicendo che DATE_FORMAT è una funzione sconosciuta.
Ma il mio database (mysql) conosce quella funzione, quindi fondamentalmente ciò che sta accadendo è che Doctrine sta analizzando quella query dietro le quinte (e alle tue spalle) e trova un'espressione che non comprende, considerando la query non valida.
Quindi, se come me vuoi essere in grado di inviare semplicemente una stringa al database e lasciare che se ne occupi (e lasciare che lo sviluppatore si assuma la piena responsabilità della sicurezza), dimenticalo.
Ovviamente potresti codificare un'estensione per consentirlo in un modo o nell'altro, ma altrettanto bene usare mysqli per farlo e lasciare Doctrine ai suoi affari ORM.
mysqldump
caricare dati da dump precedenti o rilasciare tabelle, di solito scrivo uno script di shell per quel lavoro e poi scrivo un'attività (o "comando", nel linguaggio Symfony2 ) che esegue lo script di shell. Lo scopo di un ORM, a quanto ho capito, è astrarre il lavoro ripetitivo, e se stai facendo qualcosa come troncare una tabella, non vedo come avrebbe senso portare Doctrine nel quadro poiché Doctrine non lo fa ' t rendere questo compito più facile.