2013-08-10 16 views
15

SELECT句でサブクエリを使用して単純なSELECTクエリを実行しようとしていますが、これを行う方法が見つからないだけです。私はDQLとQueryBuilderの両方で試しましたが、いずれも動作しません。コードは、私はちょうど問題を説明するための単純な例です、私はサブクエリの正当なユースケースを持って、私はちょうど結合を使用することができると言うことはありません。Doctrine 2:(SELECT句の)サブクエリ列を使用する方法

// With QueryBuilder 
$query = $qb->select(array('a', 
          '(SELECT at.addresstypeName 
           FROM e:Addresstype at 
           WHERE at.addresstypeId = a.addresstypeId 
          ) AS addresstypeName')) 
      ->from('e:Address', 'a') 
      ->where('a.addressId = :addressId') 
      ->setParameter('addressId', 1); 

// With DQL 
$dql = "SELECT a, 
       (SELECT at.addresstypeName 
        FROM e:Addresstype at 
       WHERE at.addresstypeId = a.addresstypeId 
       ) AS addresstypeName 
      FROM e:Address a 
     WHERE a.addressId = :addressId"; 
$query = $em->createQuery($dql)->setParameter(':addressId', 1); 

次の関係がアドレステーブルに定義されます。

/** 
* @ORM\ManyToOne(targetEntity="Addresstype") 
* @ORM\JoinColumns({ 
* @ORM\JoinColumn(name="addresstype_id", referencedColumnName="addresstype_id") 
* }) 
*/ 
protected $addresstype; 

ネイティブSQLでは、クエリは次のようになります。

SELECT 
    a.*, 
    (
     SELECT at.addresstype_name 
     FROM addresstype at 
     WHERE at.addresstype_id = a.addresstype_id 
    ) AS addresstype_name 
FROM address a 
WHERE a.address_id = 1 

任意のアイデア?私にとって

答えて

16
$query = $qb->select('a') 
    ->addSelect('(SELECT at.addresstypeName 
      FROM e:Addresstype at 
      WHERE at.addresstypeId = a.addresstypeId) AS addresstypeName' 
     ) 
    ->from('e:Address', 'a') 
    ->where('a.addressId = :addressId') 
    ->setParameter('addressId', 1); 
+0

はちょうど私が取得し、それを試してみましたジョインこと次のエラー:[意味的なエラー]行0、列112の 'addresstypeId)':エラー:クラスNP \ entities \ AddressにはフィールドまたはアソシエーションはありませんaddresstypeId addresstypeIdはAddressエンティティで定義されないため、通常、外部キーを使用する必要はありません。 – Rocket04

+0

あなたの質問に答えるためにあなたのサブクエリをコピーしてコピーするだけです。私はあなたのエンティティ(とスキーマ)についての情報なしでこのサブクエリを修正することはできません。どちらの場合でも、実際のスキーマを使用して実際のクエリを投稿するのが最善です。あなたの質問「サブクエリ列の使い方」に回答しましたので、同意してください。私はあなたに良いサブクエリを書くのを手伝うつもりです(これは別の質問です)。 – Flip

+0

スキーマの詳細を追加しました。私はそこに関係があることを言及する価値があったと思います。 – Rocket04

9

教義を持つサブクエリは、このクエリで動作します:

$qb->select('e.field') 
    ->addSelect('(SELECT count(mv.nm) 
       FROM Clt\Bundle\MyBundle\Entity\MV mv 
       LEFT JOIN Clt\Bundle\MyBundle\Entity\M ma WITH mv.nm=ma.nm 
       WHERE mv.ne=e.ne and ma.nm is null 
       ) AS nm' 
    ) 
    ->from($this->_entityName, 'e') 
    ->leftJoin('e.m', 'm') 
    ->where($qb->expr()->eq('t.id'.$typeModule, $idElementModule)); 

注左にあなたの代わりにONのと一緒に使用しなければなりません...

関連する問題