我不明白如何让它发挥作用.
我有:
partner有字段id和表的表namepartner_address包含两个字段的表:id_partner和id_addressaddress包含字段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行
您必须仅加入所选实体所具有的属性.
在的第一个参数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.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
}
}
Run Code Online (Sandbox Code Playgroud)