如何使用 symfony 在教义查询构建器中选择表之间的特定连接?
Posted
技术标签:
【中文标题】如何使用 symfony 在教义查询构建器中选择表之间的特定连接?【英文标题】:How to select a specific connection between tables in doctrine querybuilder with symfony? 【发布时间】:2021-12-30 01:06:29 【问题描述】:我正在使用 symfony 5.4 和教义捆绑包 2.4。 我有一个实体“发送”,我将地址与不同的连接连接起来
class Sending
...
/**
* @ORM\ManyToMany(targetEntity=Address::class, inversedBy="getSendingAsSender")
* @ORM\JoinTable(name="sending_sender_address")
*/
private $sender;
/**
* @ORM\ManyToMany(targetEntity=Address::class, inversedBy="getSendingAsRecipient")
* @ORM\JoinTable(name="sending_recipient_address")
*/
private $recipient;
以及对应的地址实体。
创建发送类型的对象时,我可以访问发送者和接收者,因此对象的定义似乎很好。
现在我想使用 querybuilder 创建所有发件人或收件人的列表
$builder = $this->entitiyManager->getRepository(Sending::class)
->createQueryBuilder('s')
->join(Address::class, 'a')
...
这会创建一个
select ... from sending s inner join address a
没有任何连接数据或 on 子句,并且中间没有 m:n 连接表。 在地址加入之前添加 ->join('sending_sender_address','sa') 时,它告诉我,没有实体正在发送_sender_address。
我最终需要的是地址对象的集合,它们是任何或选定发送的发件人(或收件人)。
如何正确地进行连接以及如何选择应该使用哪个连接表?
【问题讨论】:
这能回答你的问题吗? Doctrine query builder using inner join with conditions 应该有效,谢谢。只是迪伦在下面的回答更接近我的需要。 【参考方案1】:您可以轻松地执行以下操作:
$builder = $this->entitiyManager->getRepository(Sending::class)
->createQueryBuilder('s');
//check however you want which data you need
if($type === '')
$builder->join('sa.sender', 'a');
else
$builder->join('sa.recipient', 'a');
或者如果 $type 是 sender
或 recipient
:
$builder = $this->entitiyManager->getRepository(Sending::class)
->createQueryBuilder('s')
->join('s.'.$type, 'a')
;
您无需添加 where 子句即可仅获取与您的发送实体相关的地址,只需从您的加入中选择地址即可。
【讨论】:
是的,这是一个完美的提示(几乎)。我只需要交换地址成为主要部分并加入发送。否则选择地址为空。现在它可以按需要工作。非常感谢 您仍然可以通过发送作为主要部分来做到这一点,但是如果您特别想选择需要使用->addSelect('sa.sender')
或->select('sa.sender')
的地址,请随时验证我的答案是否有帮助你以上是关于如何使用 symfony 在教义查询构建器中选择表之间的特定连接?的主要内容,如果未能解决你的问题,请参考以下文章
Symfony - 在学说查询构建器中使用 orWhere()
在 Symfony Doctrine 查询构建器中使用 PostgreSQL NOT SIMILAR TO