私はSymfony 2.8でDoctrine 2.4を使用しています。私は友情システムを構築しようとしています。1 Doctrine DQLで2つのクエリをマージする
私は私のMateRelationshipエンティティを持っている:
class MateRelationship
{
/**
* @var integer
*
* @ORM\Column(type="integer", name="id")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="Acme\UserBundle\Entity\User")
* @ORM\JoinColumn(name="sender", referencedColumnName="id", nullable=false)
*
*/
private $sender;
/**
* @ORM\ManyToOne(targetEntity="Acme\UserBundle\Entity\User")
* @ORM\JoinColumn(name="receiver", referencedColumnName="id", nullable=false)
*
*/
private $receiver;
/**
* @var \DateTime
*
* @ORM\Column(type="datetime", nullable=false)
*/
private $date;
/**
* @var boolean
*
* @ORM\Column(type="boolean", nullable=false)
*/
private $invitationAccepted;
私の目標は、与えられたユーザ(利用者が送信者または受信者である場合にかかわらず)のためのすべての受け入れの友人関係を取得するためにDQLクエリを作ることです。
私は2つのクエリで結果をマージすることができましたが、最適化されておらず、$limit
をこのように実装するのは難しいです。
public function getMates($user, $limit = 0){
$query1 = $this->_em->createQuery('SELECT m, u.nickname, u.username FROM AcmeUserBundle:MateRelationship m JOIN m.receiver u WHERE m.invitationAccepted = 1 AND m.sender = :user')
->setParameter('user', $user);
try{
$result1 = $query1->getResult();
}
catch(\Doctrine\ORM\NoResultException $e){
$result1 = [];
}
$query2 = $this->_em->createQuery('SELECT m, u.nickname, u.username FROM AcmeUserBundle:MateRelationship m JOIN m.sender u WHERE m.invitationAccepted = 1 AND m.receiver = :user')
->setParameter('user', $user);
try{
$result2 = $query2->getResult();
}
catch(\Doctrine\ORM\NoResultException $e){
$result2 = [];
}
return array_merge($result1, $result2);
}
私は->setMaxResults($limit)
を使用できるように、単一のクエリを持っているしたいのですが、私はあなたが簡単に行うことができますどのようにあなたの助けのための1 のおかげでこれらの2つのクエリをマージする:)
を使用しての提案です。 – yceruto
しかしそれほど単純ではないと思います。 'usen.nickname'と' m.sender <>:user'を使うとどうなりますか? – yceruto
この場合、 'JOIN'の代わりに' LEFT JOIN'を使う必要があります。そうでないと 'sender'と' receiver'の両方が ':user'と同じになります。 – yceruto