【问题标题】:Join between ManyToMany properties at Doctrine2 entities在 Doctrine2 实体的 ManyToMany 属性之间加入
【发布时间】:2015-06-09 00:52:54
【问题描述】:

我有这个表关系:

这是messagesemails 的实体的样子(我刚刚添加了重要信息):

class Message
{
    /**
     * @var Brand
     *
     * @ORM\ManyToOne(targetEntity="Brand")
     * @ORM\JoinColumn(name="brands_id", referencedColumnName="id")
     */
    protected $brand;

    ...

}


class Email
{
    /**
     * @ORM\ManyToMany(targetEntity="Message", inversedBy="messageXrefMail", cascade={"persist", "remove"})
     * @ORM\JoinTable(name="emails_messages_xref",
     *      joinColumns={@ORM\JoinColumn(name="emails_id", referencedColumnName="id")},
     *      inverseJoinColumns={@ORM\JoinColumn(name="messages_id", referencedColumnName="id")}
     * )
     */
    protected $emailsMessageXref;

    ...
}

我需要获取与email 相关的brands,但在这种情况下我不知道该怎么做。主查询中包含一些表,我得到了这个:

public function findEmailValues($eid)
{
    $qb = $this->_em->createQueryBuilder();
    $qb->select('e.id', 'r.id')
        ->from('PDOneBundle:Email', 'e')
        ->leftJoin('PDOneBundle:Representative', 'r', \Doctrine\ORM\Query\Expr\Join::WITH, 'e.rep = r.id')
        ->leftJoin('PDOneBundle:Territory', 't', \Doctrine\ORM\Query\Expr\Join::WITH, 'r.territory = t.id')
        ->leftJoin('PDOneBundle:Target', 'tg', \Doctrine\ORM\Query\Expr\Join::WITH, 't.id = tg.territory')
        ->where('e.id = :eid')
        ->setParameter('eid', $eid);

    return $qb->getQuery()->getSingleResult();
}

但我不知道从那里去哪里。我可以在构建 DQL 时获得一些帮助吗?

【问题讨论】:

  • 品牌和邮箱的关系怎么样?
  • @Richard 这两者之间没有关系
  • 您问的是如何获取与电子邮件相关的品牌,您的意思是通过电子邮件 -> 消息 -> 品牌关系?
  • @Richard 正是我所要求的

标签: php symfony doctrine-orm dql symfony-2.6


【解决方案1】:

这应该可行:

    $qb->select('e.id', 'r.id', 'br')
        ->from('PDOneBundle:Email', 'e')
        ->leftJoin('PDOneBundle:Representative', 'r', \Doctrine\ORM\Query\Expr\Join::WITH, 'e.rep = r.id')
        ->leftJoin('PDOneBundle:Territory', 't', \Doctrine\ORM\Query\Expr\Join::WITH, 'r.territory = t.id')
        ->leftJoin('PDOneBundle:Target', 'tg', \Doctrine\ORM\Query\Expr\Join::WITH, 't.id = tg.territory')
        ->leftJoin('e.emailsMessageXref', 'me') // many to many on email -> messages
        ->leftJoin('me.brand', 'br') // many to one on message -> brand
        ->where('e.id = :eid')
        ->setParameter('eid', $eid);        

【讨论】:

  • 请注意,将电子邮件中的 $emailsMessageXref 属性重命名为 $messages 可能会更好 - 阅读起来更清晰。
  • 此外,如果您的关系设置正确,则不需要 \Doctrine\ORM\Query\Expr\Join::WITH 部分。例如。 ->leftJoin('PDOneBundle:Representative', 'r', \Doctrine\ORM\Query\Expr\Join::WITH, 'e.rep = r.id') 可以重写为 ->leftJoin('e .representative', 'r')
猜你喜欢
  • 2021-09-03
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 2013-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-28
相关资源
最近更新 更多