2013-03-08 11 views
6

W moim repozytorium mam tej kwerendy:Doctrine Query Builder nie działa z aktualizacją i INNER JOIN

$qb = $this->getEntityManager()->createQueryBuilder(); 
$qb 
    ->update('MyBundle:Entity1', 'e1') 
    ->join('e1.Entity2', 'e2') 
    ->set('e1.visibile', '1') 
    ->andWhere('e2.id = :id')->setParameter("id", 123) 
; 

rzut ten błąd

[Semantical Error] line 0, col 66 near 'e2.id = :id': Error: 'e2' is not defined 

Sprawdziłem relację i to jest w porządku. Czy jest jakiś problem przy użyciu dołączania do aktualizacji kwerendy?

+0

nie ma '' e1' Entity2' memeber do swojej klasie? – DonCallisto

+1

Spróbuj wydrukować plik DQL, aby zobaczyć, co mogło pójść nie tak. ('$ qb-> getQuery() -> getDQL()') –

+0

Twój błąd nie pasuje do twojego kodu - błąd pokazuje ': use' - gdzie jest to w twoim kodzie? – ManseUK

Odpowiedz

5

Doctrine DQL nie obsługuje dołączania aktualizacji.

Spróbuj wykonać następujące czynności:

$qb = $this->getEntityManager()->createQueryBuilder(); 
$qb 
    ->update('MyBundle:Entity1', 'e1') 
    ->set('e1.visibile', '1') 
    ->where('e1.Entity2 = :id') 
    ->setParameter("id", 123) 
; 

Można ustawić identyfikator, tak długo, jak to jest klucz podstawowy, połączonego podmiotu bezpośrednio, jak gdyby to była żywa, Doctrine go na mapie.

Robię dokładnie to samo w moich pytaniach i to działa.

+0

Chciałbym usłyszeć, co jest nieużyteczne lub złe w mojej odpowiedzi, na zasłużenie. W ten sposób mogę poprawić moją odpowiedź! –

+0

http://stackoverflow.com/questions/5594853/doctrine-2-update-with-left-join u re rigth – bleuscyther

3

Spróbuj użyć podzapytania zamiast Join will not work in DQL while you re doing an update:

LEFT JOIN, or JOINs in particular are only supported in UPDATE statements of MySQL. DQL abstracts a subset of common ansi sql, so this is not possible. Try with a subselect:

$qb = $this->getEntityManager()->createQueryBuilder(); 
    $qb ->update('MyBundle:Entity1', 'e') 
     ->set('e.visibile', '1') 
     ->where('e.id IN (SELECT e1.id FROM Entity1 e1 INNER JOIN e2.Entity2 e2 WHERE e2 = :id') 
     ->setParameter("id", 123); 
+0

to nie działa: 'SQLSTATE [HY000]: Błąd ogólny: 1093 Nie można określić tabela docelowa "my_entity1" dla aktualizacji w klauzuli FROM ". http://stackoverflow.com/questions/45494/mysql-error-1093-cant-specify-target-table-dla-update-in-od-clause –

6

Nie można używać dołączyć na aktualizacji i usuwania zapytań. Musisz użyć podkwerend.

Joins are not supported on update and delete queries because it is not supported on all dbms. It won't be implemented in Doctrine 1 or Doctrine 2. You can however get the same affect by using subqueries.

http://www.doctrine-project.org/jira/browse/DC-646

Jeśli używasz MySQL, za pomocą podzapytania nie będzie działać. Będziesz wtedy musiał użyć 2 zapytań.

In MySQL, you cannot modify a table and select from the same table in a subquery

http://dev.mysql.com/doc/refman/5.0/en/subqueries.html

+0

Cóż, zazwyczaj łączysz się z innym stołem, a nie z jednym jesteś w trakcie aktualizacji, więc w większości przypadków powinien działać w MySQL. –