gpt4 book ai didi

doctrine-orm - createQueryBuilder 和 leftJoin 是如何工作的?

转载 作者:行者123 更新时间:2023-12-05 08:44:08 25 4
gpt4 key购买 nike

我不知道如何让它工作。

我有:

  • partner 表,包含字段 idname
  • 包含两个字段的 partner_address 表:id_partnerid_address
  • 一个表 address,包含字段 id 和引用 town(id) 的外部键 id_town
  • 一个表 town,包含字段 idnamepostal_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 完整语法,遵循 the documentation .

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

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);
}

我收到这个错误:

Warning: Missing argument 2 for Doctrine\ORM\QueryBuilder::leftJoin(), called in /blabla/Repository/PartenaireRepository.php on line 18 and defined in /blabla/symfony/vendor/doctrine/orm/lib/Doctrine/ORM/QueryBuilder.php line 767

最佳答案

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

join()leftJoin()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'));

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

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


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

在文件 PartenaireRepository.php 中,我正确地使用了 createQueryBuilder('p')。以下是如何使用 createQueryBuilder() 连续进行两个连接:

class PartenaireRepository extends EntityRepository
{

/**
* Retrieval of all partners given for a given postal code.
*/
public function findAllActiveByCp($cp)
{
return $this->createQueryBuilder('p')
->leftJoin('p.adresses', 'a')
->leftJoin('a.ville', 'v')
->where('v.cp=:cp')
->setParameter('cp', $cp);
... blabla
}
}

关于doctrine-orm - createQueryBuilder 和 leftJoin 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15552333/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com