php - without - symfony sql query




Exécuter du SQL brut en utilisant Doctrine 2 (6)

Comment exécuter une requête brute et renvoyer les données.

Accédez à votre manager 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 hors résultat comme ceci:

$this->appendStringToFile("first row foobar is: " . $result[0]['foobar']);

Je veux exécuter SQL brut en utilisant Doctrine 2

J'ai besoin de tronquer les tables de base de données et d'initialiser les tables avec les données de test par défaut.


Dans votre modèle, créez l'instruction SQL brute (l'exemple ci-dessous est un exemple d'un intervalle de date que j'ai dû utiliser mais remplacez le votre.) Si vous faites un SELECT ajouter -> 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 voulez rechercher l'objet de connexion fourni par le gestionnaire d'entités:

$conn = $em->getConnection();

Vous pouvez ensuite interroger / exécuter directement contre:

$statement = $conn->query('select foo from bar');
$num_rows_effected = $conn->exec('update bar set foo=1');

Voir les documents pour l'objet de connexion à http://www.doctrine-project.org/api/dbal/2.0/doctrine/dbal/connection.html


Je l'ai eu à travailler 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 en fonction de vos besoins.


Vous ne pouvez pas, Doctrine 2 n'autorise pas les requêtes brutes. Il peut sembler que vous pouvez mais si vous essayez quelque chose comme ceci:

$sql = "SELECT DATE_FORMAT(whatever.createdAt, '%Y-%m-%d') FORM whatever...";
$em = $this->getDoctrine()->getManager();
$em->getConnection()->exec($sql);

Doctrine va cracher une erreur 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 dérouler est Doctrine analyse cette requête derrière les scènes (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 faire (et laisser le développeur assumer l'entière responsabilité de la sécurité), oubliez-le.

Bien sûr, vous pouvez coder une extension pour l'autoriser d'une manière ou d'une autre, mais vous pouvez également utiliser mysqli pour le faire et laisser Doctrine à son entreprise ORM.


//$sql - sql statement
//$em - entity manager

$em->getConnection()->exec( $sql );




doctrine