具有一对多关系和使用 Doctrine 的多个条件的 QueryBuilder
QueryBuilder with One To Many relationship and several conditions using Doctrine
我会尽力解释我的问题。我有一条消息与另一个名为 Reply 的实体相关(一条消息可以有零个或 n 个回复),我想考虑以下情况:
- 如果UserA创建了一条消息给UserB(UserA是创建者)
但是 UserB 没有回复消息我不想收到消息
- 同上,但UserB回复了消息。我想得到
消息及其回复(如果存在回复)
- 如果 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被影响按性能)
我会尽力解释我的问题。我有一条消息与另一个名为 Reply 的实体相关(一条消息可以有零个或 n 个回复),我想考虑以下情况:
- 如果UserA创建了一条消息给UserB(UserA是创建者) 但是 UserB 没有回复消息我不想收到消息
- 同上,但UserB回复了消息。我想得到 消息及其回复(如果存在回复)
- 如果 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被影响按性能)