如何工作createQueryBuilder和leftJoin?

Oli*_*ons 1 doctrine-orm

我不明白如何让它发挥作用.

我有:

  • 一个partner有字段id和表的表name
  • 一个partner_address包含两个字段的表:id_partnerid_address
  • address包含字段id和外部键的表id_town引用town(id)
  • 一个town包含字段id,a name和的表postal_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';
Run Code Online (Sandbox Code Playgroud)

现在我想按照文档将其"翻译"成Doctrine 2完整语法.

所以我创建了一个自定义存储库:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:代码中的查询不是正确的,但是这段代码在我做的另一个自定义存储库中工作,所以我试图从这段代码开始.

我正在尝试这样的东西,但它不起作用:

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);
}
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

警告:缺少参数2学说\ ORM\QueryBuilder的:: leftJoin(),称为/blabla/Repository/PartenaireRepository.php上线18和/布拉布拉/ symfony的/供应商/教义/ ORM定义/ LIB /学说/ ORM/QueryBuilder.php第767行

Ath*_*lan 7

您必须仅加入所选实体所具有的属性.

在的第一个参数join()leftJoin()xxxJoin()传递有关选择的对象的属性名称,以及在所述第二-别名接合实体.

尝试simmilar到这个:

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

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

当然,CustomerEntity包含OneToMany在字段中的关系contacts.

请记住,在select语句中,您必须选择根实体(在我的示例中为CustomerEntity别名item).


由Olivier Pons编辑,以添加我找到解决方案的方式,并将此答案标记为有效,因为它让我走上正轨,谢谢Adam!

PartenaireRepository.phpcreateQueryBuilder('p')正确使用的文件中.以下是使用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
    }
}
Run Code Online (Sandbox Code Playgroud)