web-dev-qa-db-fra.com

Exécutez du SQL brut en utilisant Doctrine 2

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.

96
Jiew Meng

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 .

12
Jiew Meng

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();
}   
158
Jason Swett
//$sql - sql statement
//$em - entity manager

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

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.

39
fernandodof

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

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']);
12
Eric Leschinski

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();
5
badzilla

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

5
Toby Batch

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.

4
Alexis Finn