如何使用 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');
    

或者如果 $typesenderrecipient

    $builder = $this->entitiyManager->getRepository(Sending::class)
        ->createQueryBuilder('s')
        ->join('s.'.$type, 'a')
    ;

您无需添加 where 子句即可仅获取与您的发送实体相关的地址,只需从您的加入中选择地址即可。

【讨论】:

是的,这是一个完美的提示(几乎)。我只需要交换地址成为主要部分并加入发送。否则选择地址为空。现在它可以按需要工作。非常感谢 您仍然可以通过发送作为主要部分来做到这一点,但是如果您特别想选择需要使用->addSelect('sa.sender')->select('sa.sender') 的地址,请随时验证我的答案是否有帮助你

以上是关于如何使用 symfony 在教义查询构建器中选择表之间的特定连接?的主要内容,如果未能解决你的问题,请参考以下文章

Symfony - 在学说查询构建器中使用 orWhere()

关于与查询构建器的“一对多”关系的教义内连接

首先在doctrine查询构建器中选择完全匹配

在 Symfony Doctrine 查询构建器中使用 PostgreSQL NOT SIMILAR TO

如何在 symfony 2 和教义 2 中自定义 sql 日志?

Symfony4如何使用查询构建器获取对象