Frage Führen Sie Raw SQL mit Doctrine 2 aus


Ich möchte Raw SQL mit Doctrine 2 ausführen

Ich muss die Datenbanktabellen abschneiden und Tabellen mit Standardtestdaten initialisieren.


75
2017-07-24 12:09


Ursprung


Antworten:


Hier ist ein Beispiel für eine rohe Abfrage in Doctrine 2, die ich gerade mache:

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

141
2018-03-30 15:12



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

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

43
2018-02-10 05:45



Ich habe es geschafft zu arbeiten, vorausgesetzt, Sie verwenden 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);

Sie können FETCH_TYPE an Ihre Bedürfnisse anpassen.


30
2017-11-26 02:38



Wie führe ich eine rohe Abfrage aus und gebe die Daten zurück.

Haken Sie sich in Ihrem Manager ein und stellen Sie eine neue Verbindung her:

$manager = $this->getDoctrine()->getManager();
$conn = $manager->getConnection();

Erstellen Sie Ihre Abfrage und fetchAll:

$result= $conn->query('select foobar from mytable')->fetchAll();

Holen Sie die Daten wie folgt aus dem Ergebnis:

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

11
2018-02-14 17:45



Ich habe herausgefunden, dass die Antwort wahrscheinlich lautet:

Mit NativeQuery können Sie native ausführen   SQL, Mapping der Ergebnisse nach   Ihre Spezifikationen. So ein   Spezifikation, die beschreibt, wie ein   Die SQL-Ergebnismenge wird einer Doctrine zugeordnet   Ergebnis wird durch a dargestellt   ResultSetMapping.

Quelle: Natives SQL.


9
2017-07-25 09:09



Ich hatte das gleiche Problem. Sie möchten das vom Entity Manager bereitgestellte Verbindungsobjekt anzeigen:

$conn = $em->getConnection();

Sie können dann direkt abfragen / ausführen:

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

Siehe die Dokumentation für das Verbindungsobjekt unter http://www.doctrine-project.org/api/dbal/2.0/doctrine/dbal/connection.html


4
2018-03-06 12:17



Sie können Doctrine 2 nicht für unformatierte Abfragen verwenden. Es mag so aussehen wie du kannst, aber wenn du so etwas probierst:

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

Doctrine gibt einen Fehler aus, der besagt, dass DATE_FORMAT eine unbekannte Funktion ist.

Aber meine Datenbank (mysql) kennt diese Funktion, also geht es im Grunde darum, Doctrine analysiert diese Abfrage hinter den Kulissen (und hinter Ihrem Rücken) und findet einen Ausdruck, den sie nicht versteht, wenn die Abfrage als ungültig betrachtet wird.

Wenn Sie also wie ich in der Lage sein möchten, einfach eine Zeichenfolge an die Datenbank zu senden und sie damit umgehen zu lassen (und den Entwickler die volle Verantwortung für die Sicherheit übernehmen zu lassen), vergessen Sie es.

Natürlich könntest du eine Erweiterung programmieren, um das auf die eine oder andere Weise zu erlauben, aber du kannst genauso gut mit mysqli arbeiten und Doctrine dem ORM-Geschäft überlassen.


4
2017-09-27 15:28



Erstellen Sie in Ihrem Modell die Raw-SQL-Anweisung (Beispiel unten ist ein Beispiel für ein Datumsintervall, das ich verwenden musste, aber ersetzen Sie Ihr eigenes. Wenn Sie einen SELECT-Befehl ausführen -> fetchall () zum Aufruf execute ().

   $sql = "DELETE FROM tmp 
            WHERE lastedit + INTERVAL '5 minute' < NOW() ";

    $stmt = $this->getServiceLocator()
                 ->get('Doctrine\ORM\EntityManager')
                 ->getConnection()
                 ->prepare($sql);

    $stmt->execute();

3
2017-08-11 13:58