11

私のリポジトリには、次のクエリがあります。

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

このエラーをスローします

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

関係を確認しましたが、正しいです。クエリの更新で結合を使用する際に問題はありますか?

4

4 に答える 4

15

更新クエリと削除クエリで結合を使用することはできません。サブクエリを使用する必要があります。

ジョインは、すべての dbms でサポートされているわけではないため、更新クエリと削除クエリではサポートされていません。Doctrine 1 または Doctrine 2 では実装されません。ただし、サブクエリを使用して同じ効果を得ることができます。

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

MySQL を使用している場合、サブクエリの使用は機能しません。その後、2 つのクエリを使用する必要があります。

MySQL では、テーブルを変更して、サブクエリで同じテーブルから選択することはできません

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

于 2014-10-31T16:16:25.277 に答える
6

Doctrine DQL は join in update をサポートしていません。

次のことを試してください:

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

それがエンティティであるかのように、リンクされたエンティティの主キーである限り、ID を直接設定できます。Doctrine はそれをマップします。

私はクエリでまったく同じことをしていますが、うまくいきます。

于 2013-03-08T15:53:40.170 に答える
5

代わりにサブクエリを使用してみてください。更新を行っている間、結合は DQL で機能しません

LEFT JOIN、または特に JOIN は、MySQL の UPDATE ステートメントでのみサポートされています。DQL は一般的な ansi sql のサブセットを抽象化するため、これは不可能です。サブセレクトで試してください:

$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);
于 2013-03-09T03:52:02.193 に答える