1

私はそれを機能させる方法がわかりません。

私は持っています:

  • フィールドpartnerid_name
  • partner_address2つのフィールドを持つテーブル:id_partnerおよびid_address
  • 参照addressするフィールドidと外部キーを含むテーブルid_towntown(id)
  • townフィールド、、、およびid_namepostal_code

特定の町にいるすべてのパートナーを選択したいpostal_code このクエリは機能します:

SELECT p.nom, v.nom
FROM partner p
JOIN partner_address pa
ON pa.id_partner=p.id
JOIN address a
ON pa.id_address = a.id 
JOIN town t
ON a.id_town=t.id
WHERE t.postal_code='13480';

ここで、ドキュメントに従って、それをDoctrine2の完全な構文に「変換」したいと思います。

だから私はカスタムリポジトリを作りました:

src/Society/Bundle/MyProjectBundle/Repository/PartnerRepository.php

このリポジトリでは、対応する関数を作成しようとしています。

<?php

namespace HQF\Bundle\PizzasBundle\Repository;

use Doctrine\ORM\EntityRepository;

class PartenaireRepository extends EntityRepository
{
    /**
     * Get all active partners from a given postal code.
     */
    public function findAllActiveByCp($cp)
    {
        return $this->createQueryBuilder('p')
            ->where('p.dateVFin IS NULL')
            ->andWhere('p.cp=:cp')
            ->addOrderBy('p.cp', 'DESC')
            ->setParameter('cp', $cp);
    }
}

注:コード内のクエリは正しいものではありませんが、このコードは私が作成した別のカスタムリポジトリで機能するため、このコードから始めようとしています。

私はこのようなことを試みていますが、うまくいきません:

public function findAllActiveByCp($cp)
{
    $qb = $this->createQueryBuilder('p');
    return $qb
        ->leftJoin('partner_address pa ON pa.id_partner=p.id')
        ->leftJoin('address a ON pa.id_address = a.id')
        ->leftJoin('town t ON a.id_ville=t.id')
        ->where('p.dateVFin IS NULL')
        ->andWhere('t.cp=:cp')
        ->addOrderBy('t.cp', 'DESC')
        ->setParameter('cp', $cp);
}

このエラーが発生します:

警告:Doctrine \ ORM \ QueryBuilder :: leftJoin()の引数2がありません。これは、18行目の/blabla/Repository/PartenaireRepository.phpで呼び出され、/ blabla / symfony / vendor / doctrine / orm / lib / Doctrine /ORM/で定義されています。 QueryBuilder.php行767

4

2 に答える 2

9

選択したエンティティが持つプロパティのみを結合する必要があります。

join()またはの最初のパラメータでleftJoin()xxxJoin()選択したオブジェクトに関連する属性名を渡し、2番目のパラメータで-結合されたエンティティのエイリアス。

これと同じようにしてみてください:

$q = $this->em()->createQueryBuilder();

$q->select(['item', 'itemContact'])
  ->from('ModuleAdmin\Entity\CustomerEntity', 'item')
  ->leftJoin('item.contacts', 'itemContact')
  ->andWhere($q->expr()->like('item.name', ':customerNameStart'));

もちろん、フィールドにはCustomerEntitycontainsOneToManyリレーションがありますcontacts

selectステートメントでは、ルートエンティティを選択する必要があることを忘れないでください(私の例では、CustomerEntityエイリアスはitem)。


Olivier Ponsが編集して、私が解決策を見つけた方法を追加し、この回答を有効としてマークします。これにより、私は正しい方向に進んだので、Adamに感謝します。

ファイルでは、PartenaireRepository.php私はcreateQueryBuilder('p')適切に使用しました。次のコマンドを使用して、2つの結合を連続して作成する方法は次のcreateQueryBuilder()とおりです。

class PartenaireRepository extends EntityRepository
{

    /** 
     * Récupération de tous les partenaires donnés pour un
     * code postal donné.
     */
    public function findAllActiveByCp($cp)
    {   
        return $this->createQueryBuilder('p')
            ->leftJoin('p.adresses', 'a')
            ->leftJoin('a.ville', 'v')
            ->where('v.cp=:cp')
            ->setParameter('cp', $cp);
    ... blabla
    }
}
于 2013-03-23T16:05:38.273 に答える
1

私はあなたがしていることのために、あなたはleftJoinメソッドに4つの引数を提供する必要があると信じています。

->leftJoin('partner_address', 'pa', 'ON', 'pa.id_partner = p.id')

したがって、クエリビルダーチェーンは次のようになります。

public function findAllActiveByCp($cp)
{
    $qb = $this->createQueryBuilder('p');
    return $qb
        ->leftJoin('partner_address', 'pa', 'ON', 'pa.id_partner = p.id')
        ->leftJoin('address', 'a', 'ON', 'pa.id_address = a.id')
        ->leftJoin('town', 't', 'ON', 'a.id_ville = t.id')
        ->where('p.dateVFin IS NULL')
        ->andWhere('t.cp=:cp')
        ->addOrderBy('t.cp', 'DESC')
        ->setParameter('cp', $cp)
    ;
}
于 2013-03-21T19:14:49.310 に答える