Reputation: 175
Basically, I have two entities, Place and Event:
/**
* 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;
}
and
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;
When I'm querying Places, I would like that not all Events would be joined, but only those which are taking place today (eventStarts = today). Is there a way to do it only with Doctrine or MySQL?
Upvotes: 0
Views: 71
Reputation: 4119
Pretty straightforward.
$qb = $this->getEntityManager()->createQueryBuilder();
If you want to only get places which have an event in a specific date range:
$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();
If you would like to get all places, even if they don't have an event, but join an event if there is one in the specified range:
$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();
Upvotes: 1