Je veux exécuter du SQL brut en utilisant Doctrine 2
Je dois tronquer les tables de base de données et les initialiser avec des données de test par défaut.
J'ai découvert que la réponse est probablement:
NativeQuery vous permet d'exécuter du SQL natif en mappant les résultats en fonction de vos spécifications. Une telle spécification qui décrit comment un ensemble de résultats SQL est mappé sur un résultat Doctrine est représentée par un ResultSetMapping.
Source: SQL natif .
Voici un exemple de requête brute dans Doctrine 2 que je suis en train de faire:
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();
}
//$sql - sql statement
//$em - entity manager
$em->getConnection()->exec( $sql );
Je dois le faire en faisant cela, en supposant que vous utilisez 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);
Vous pouvez modifier le FETCH_TYPE selon vos besoins.
Accrochez-vous à votre responsable et établissez une nouvelle connexion:
$manager = $this->getDoctrine()->getManager();
$conn = $manager->getConnection();
Créez votre requête et fetchAll:
$result= $conn->query('select foobar from mytable')->fetchAll();
Obtenez les données du résultat comme ceci:
$this->appendStringToFile("first row foobar is: " . $result[0]['foobar']);
Dans votre modèle, créez l'instruction SQL brute (l'exemple ci-dessous est un exemple d'intervalle de date que je devais utiliser mais substituer le vôtre. Si vous effectuez une opération SELECT, ajoutez -> fetchall () à l'appel execute ().
$sql = "DELETE FROM tmp
WHERE lastedit + INTERVAL '5 minute' < NOW() ";
$stmt = $this->getServiceLocator()
->get('Doctrine\ORM\EntityManager')
->getConnection()
->prepare($sql);
$stmt->execute();
J'ai eu le même problème. Vous souhaitez rechercher l'objet de connexion fourni par le gestionnaire d'entités:
$conn = $em->getConnection();
Vous pouvez alors interroger/exécuter directement contre elle:
$statement = $conn->query('select foo from bar');
$num_rows_effected = $conn->exec('update bar set foo=1');
Voir la documentation de l'objet de connexion à l'adresse http://www.doctrine-project.org/api/dbal/2.0/doctrine/dbal/connection.html
Vous ne pouvez pas, Doctrine 2 n'autorise pas les requêtes brutes. Cela peut sembler possible, mais si vous essayez quelque chose comme ça:
$sql = "SELECT DATE_FORMAT(whatever.createdAt, '%Y-%m-%d') FORM whatever...";
$em = $this->getDoctrine()->getManager();
$em->getConnection()->exec($sql);
Doctrine va cracher une erreur en disant que DATE_FORMAT est une fonction inconnue.
Mais ma base de données (mysql) connaît cette fonction, donc ce qui est en train de se passer est Doctrine analyse cette requête en coulisse (et derrière votre dos) et trouve une expression qu'elle ne comprend pas. , considérant que la requête est invalide.
Donc, si comme moi vous voulez pouvoir simplement envoyer une chaîne à la base de données et la laisser la gérer (et laisser le développeur assumer l'entière responsabilité de la sécurité), oubliez-la.
Bien sûr, vous pouvez coder une extension pour permettre cela d’une manière ou d’une autre, mais vous pouvez également utiliser mysqli pour le faire et laisser Doctrine à son entreprise ORM.