具有一对多关系和使用 Doctrine 的多个条件的 QueryBuilder

QueryBuilder with One To Many relationship and several conditions using Doctrine

我会尽力解释我的问题。我有一条消息与另一个名为 Reply 的实体相关(一条消息可以有零个或 n 个回复),我想考虑以下情况:

  1. 如果UserA创建了一条消息给UserB(UserA是创建者) 但是 UserB 没有回复消息我不想收到消息

  1. 同上,但UserB回复了消息。我想得到 消息及其回复(如果存在回复)

  1. 如果 UserB 向 UserA 发送消息,我想通过 如果存在回复,它的回复

我的消息实体(我将只放置 OneToMany 关系):

<?php
namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;


/**
* @ORM\Table(name="messages")
* @ORM\Entity
* @ORM\Entity(repositoryClass="AppBundle\Repository\MessageRepository")
*/
class Message {

/**
* @ORM\OneToMany(targetEntity="ReplyMessage", mappedBy="message")
*/
private $replies;

/**
 * Add replies
 *
 * @param \AppBundle\Entity\ReplyMessage $replies
 * @return Message
 */
public function addReply(\AppBundle\Entity\ReplyMessage $replies)
{
    $this->replies[] = $replies;

    return $this;
}

/**
 * Remove replies
 *
 * @param \AppBundle\Entity\ReplyMessage $replies
 */
public function removeReply(\AppBundle\Entity\ReplyMessage $replies)
{
    $this->replies->removeElement($replies);
}

/**
 * Get replies
 *
 * @return \Doctrine\Common\Collections\Collection 
 */
public function getReplies()
{
    return $this->replies;
}

我用来实现 objective 的代码如下:

$query = $this->createQueryBuilder('message')
    ->where('message.creator = :username or message.receiver = :username')
    ->leftJoin('message.replies', 'replies')
    ->andWhere('replies.user = :username')
    ->setParameter('username', $username)
    ->getQuery();

$sent = $query->getResult();

return $sent;

我不是用 Doctrine 构建查询的专家,我不知道现在如何控制我的所有案例,如果有人能帮助我,我将不胜感激

这就是 QueryBuilder 的美妙之处。您可以创建这样的语句:

$query = $this->createQueryBuilder('message')
    ->where('message.creator = :username or message.receiver = :username')
    ->leftJoin('message.replies', 'replies')
    ->andWhere('replies.user = :username')
    ->setParameter('username', $username);

if (some_condition) {
    $query->andWhere('some_property');
}

if (some_other_condition) {
    $query->andWhere('some_property');
}

return $query->getQuery()->getResults();

不要在你的AppBundle\Repository\MessageRepository仓库中使用->getResult();,因为有时你需要多次使用他,例如:BreadcrumbsBundle需要查询(不是结果,еhis被影响按性能)