2017-05-11 1 views
0

Ich werde versuchen, mein Problem so gut wie möglich zu erklären. Ich habe eine Nachricht an eine andere Entität bezogene Antworten (eine Nachricht Null haben kann oder n Antworten) genannt, und ich möchte die folgenden Fälle berücksichtigen:QueryBuilder mit One to Many Beziehung und mehreren Bedingungen mit Doctrine

  1. Wenn BenutzerA eine Nachricht an BenutzerB erstellt haben (UserA ist der Schöpfer ), aber der Benutzer-B hat die Nachricht nicht, antwortete ich will nicht, Nachricht

  1. wie oben erhalten, aber der Benutzer-B hat auf die Nachricht. Ich mag die Nachricht mit ihren Antworten bekommen, wenn Antworten

existieren
  1. Wenn der Benutzer-B eine Nachricht an UserA gesendet, mag ich die Nachricht mit ihren Antworten erhalten, wenn Antworten gibt es

Meine Nachricht Entity (ich werde nur die OneToMany relantionship) setzen:

<?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; 
} 

Und den Code t Hut, den ich mein Ziel zu erreichen bin mit ist die folgende:

$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; 

Ich bin kein Experte Erstellen von Abfragen mit Lehre und ich weiß nicht, wie alle jetzt meine Fälle kontrollieren kann, wenn jemand würde ich helfen könnte Sei sehr dankbar

+0

Sollte 'getReplies()' nicht schon jede Antwort haben, weil es eine Relation ist? Auch selbstreferenzierende Beziehungen können Ihnen helfen, viel dynamischer zu werden. In der Doktrin-Seite haben sie 'User' als Beispiel benutzt. Manchmal möchten Sie "Freunde" haben, die auch nur "Benutzer" -Objekte sind. Sie können also das Benutzerobjekt als Selbstreferenz verwenden. Eine Antwort ist auch eine Nachricht, also bin ich mir sicher, dass du sie auch selbst referenzieren kannst und mit der Kraft von symfony solltest du die Daten sehr einfach bekommen. –

Antwort

1

Das ist die Schönheit von QueryBuilders. Sie können Aussagen wie diese erstellen:

$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(); 
0

nicht ->getResult(); in Sie AppBundle\Repository\MessageRepository Repository verwenden Sie, becose manchmal braucht man ihn meny mal verwenden und zum Beispiel: BreadcrumbsBundle Notwendigkeit Abfrage (nicht zur Folge haben, еhis wird durch die Leistung beeinträchtigt)