2016-04-25 10 views
0

Grundsätzlich habe ich zwei Einheiten, Ort und Ereignis:Doctrine2 One2Many verbundene Organisation Filterergebnisse

/** 
* Place 
* 
* @ORM\Table(name="place") 
* @ORM\Entity(repositoryClass="AppBundle\Repository\PlaceRepository") 
*/ 

class Place 
{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 



    /** 
    * @ORM\OneToMany(targetEntity="AppBundle\Entity\Event", mappedBy="place") 
    */ 
    private $events; 
} 

und

class Event 
{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @var \DateTime 
    * @JMS\Type("DateTime<'H:i'>") 
    * @ORM\Column(name="event_starts", type="datetime") 
    */ 
    private $eventStarts; 

    /** 
    * @var \DateTime 
    * @JMS\Type("DateTime<'Y/m/d H:i'>") 
    * @ORM\Column(name="event_ends", type="datetime", nullable=true) 
    */ 
    private $eventEnds; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="title", type="string", length=255) 
    */ 
    private $title; 

    /** 
    * @var string 
    * 
    * @ORM\Column(name="event_id", type="string", length=70) 
    */ 
    private $event_id; 

    /** 
    * @JMS\Exclude() 
    * @ORM\ManyToOne(targetEntity="Place") 
    * @ORM\JoinColumn(name="place_id", referencedColumnName="id") 
    */ 
    private $place; 

Wenn ich Orte bin abfragt, ich möchte nicht alle Ereignisse würden verbunden sein, aber nur diejenigen, die heute stattfinden (eventStarts = heute). Gibt es eine Möglichkeit, dies nur mit Doctrine oder MySQL zu tun?

Antwort

1

Ziemlich einfach.

$qb = $this->getEntityManager()->createQueryBuilder(); 

Wenn Sie nur wollen, Orte zu erhalten, die eine Veranstaltung in einem bestimmten Datumsbereich hat:

$data = $qb->select('p, e') 
     ->from('YourBundle:Place', 'p') 
     ->join('p.events', 'e') 
     ->where($qb->expr()->between('e.eventStarts', ':start', ':end')) 
     ->setParameter('start', $someStartDateTimeObject) 
     ->setParameter('end', $someEndDateTimeObject) 
     ->getQuery() 
     ->getResult(); 

Wenn Sie möchten, dass alle Plätze bekommen, auch wenn sie nicht über ein Ereignis hat aber ein Ereignis kommen, wenn es eine im angegebenen Bereich ist:

$data = $qb->select('p, e') 
     ->from('YourBundle:Place', 'p') 
     ->leftJoin('p.events', 'e', 'WITH', $qb->expr()->between('e.eventStarts', ':start', ':end')) 
     ->setParameter('start', $someStartDateTimeObject) 
     ->setParameter('end', $someEndDateTimeObject) 
     ->getQuery() 
     ->getResult(); 
+0

ich glaube, ich soll Zauberer nennen, weil ich im Grunde gleiche versucht, aber nur, was ich erreicht habe, war Orte zu filtern, was hat Ereignisse in dieser bestimmte Tag. Danke, Mann! –