1

我不知道如何使它工作。

我有:

  • partner包含字段的表idname
  • partner_address一个包含两个字段的表:id_partnerid_address
  • address包含字段和引用的id外部键的表id_towntown(id)
  • town包含字段id、aname和的表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';

现在我想按照文档将它“翻译”成 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);
    }
}

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

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

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()or leftJoin()or的第一个参数中,xxxJoin()您传递与所选对象相关的属性名称,在第二个参数中 - 连接实体的别名。

尝试与此类似:

$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 编辑以添加我如何找到解决方案,并将此答案标记为有效,因为它使我走上了正确的轨道,谢谢亚当!

在文件中PartenaireRepository.php我已经createQueryBuilder('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
    }
}
于 2013-03-23T16:05:38.273 回答
1

我相信对于您正在做的事情,您需要为该leftJoin方法提供四个参数。

->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 回答