2013-03-25 12 views
9

Vorerst succeded ich eine Funktion zu erstellen, die Daten aus der Datenbank mit Lehre der Funktion createQueryBuilder abruft.Ist es möglich, createQueryBuilder zum Einfügen/Aktualisieren zu verwenden? Wenn nicht, welche Funktion sollte ich verwenden?

Weiß jemand, ob es eine ähnliche Funktion ist es, die Datenbank einzufügen oder zu aktualisieren? Oder wie kann ich createQueryBuilder verwenden?

+0

Sie, Geck, brauchen einen gründlichen Blick auf Symfony2, Lehre zu nehmen und so weiter .... – DonCallisto

Antwort

23

Dok. 2 ORM unterstützt INSERT nicht über DQL oder DQL query builder. Für eine vollständige Syntax überprüfen Sie the EBNF of DQL.

Um Einsätze in ORM handhaben, können Sie immer von Hand eine Einheit und bleiben sie mit der EntityManager instanziiert:

$user = new \My\Entity\User(); 

$entityManager->persist($user); 
$entityManager->flush(); 

Sie nur SELECT, UPDATE und DELETE über DQL in Lehre ORM umgehen kann:

  • Select:

    SELECT u FROM My\Entity\User u WHERE u.id = :userId 
    
  • Update:

    UPDATE My\Entity\User u SET u.status = 'banned' WHERE u.id = :userId 
    
  • löschen

    DELETE My\Entity\User u WHERE u.id = :userId 
    

Sie diese Vorgänge mit dem Querybuilder als auch handhaben können:

  • Select:
$queryBuilder = $entityManager->createQueryBuilder(); 
    $queryBuilder 
     ->select('u') 
     ->from('My\Entity\User', 'u') 
     ->where($queryBuilder->expr()->eq('u.id', ':userId')); 
  • Löschen:
$queryBuilder = $entityManager->createQueryBuilder(); 
    $queryBuilder 
     ->delete('My\Entity\User', 'u') 
     ->where($queryBuilder->expr()->eq('u.id', ':userId')); 
  • Update:
$queryBuilder = $entityManager->createQueryBuilder(); 
    $queryBuilder 
     ->update('My\Entity\User', 'u') 
     ->set('u.status', 'banned') 
     ->where($queryBuilder->expr()->eq('u.id', ':userId')); 
+0

Vielen Dank für Ihre Antwort :) – user1482442

+0

Wie kann ich Update ausführen und in derselben Transaktion einfügen? Ich muss stattdessen native SQL-Abfrage verwenden? – Geany

+0

siehe '$ entityManager-> transactional()' – Ocramius

3

Eine andere Option, die Sie stattdessen mit einem QueryBuilder verwenden, verwendet Doctrine DBAL-Funktionen zum Vorbereiten und Ausführen. Wahrscheinlich ist es nicht so flexibel wie QueryBuilder, aber in manchen Situationen könnten INSERTs nützlich sein.

Die Art und Weise der Datenbankverbindung aus der Entity-Manager zu verwenden, wird immer.

+3

Es gibt einen Grund, warum das ORM dies nicht erlaubt. Die Idee besteht darin, immer die verschiedenen Listener, die berechnete Commit-Reihenfolge und die Umwandlung der DBAL-Typen zu durchlaufen. – Ocramius

0

Verwenden von QueryBuilder zum Einfügen von Daten ist nicht möglich, es sei denn, Sie sind bereit, die DQL oder SQL zu schreiben.Wenn Sie nach einer Möglichkeit suchen, Daten einfach in Ihre Datenbanktabelle einzufügen, müssen Sie zunächst sicherstellen, dass die Daten in eine Entity-Klasse für die Tabelle geladen werden, in die Sie Ihre Daten einfügen möchten. Zum Beispiel $em->persist($entity);

2

Wenn Sie DBAL QueryBuilder verwenden, ist es möglich, einzufügen.

$qb = $connection->createQueryBuilder(); 

mit dem Querybuilder einzufügen es so ist:

$qb->insert('MuBundle:MyClass', 'momc') 
    ->values (array(
     'property1 (id for example)' => '?' 
     'property2 (name for exmaple)' => '?' 
    )) 
    ->setParameter(0, $id) 
    ->setparameter(1, $name) 
Verwandte Themen