php symfony - Exécuter du SQL brut en utilisant Doctrine 2




query dql (8)

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.


Answers

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

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.


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 );

J'ai découvert que la réponse est probablement:

Une NativeQuery vous permet d'exécuter SQL natif, en mappant les résultats selon vos spécifications. Une telle spécification qui décrit comment un ensemble de résultats SQL est mappé à un résultat Doctrine est représentée par un ResultSetMapping.

Source: SQL natif .


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


J'ajoute ceci uniquement pour que vous puissiez voir un moyen rapide de l'écrire afin de pouvoir vérifier ce qui sera mis à jour avant de faire la mise à jour.

UPDATE Table 
SET  Table.col1 = other_table.col1,
     Table.col2 = other_table.col2 
--select Table.col1, other_table.col,Table.col2,other_table.col2, *   
FROM     Table 
INNER JOIN     other_table 
    ON     Table.id = other_table.id 




php sql doctrine