基本上,我有两个实体,地点和事件:
/**
* Place
*
* @ORMTable(name="place")
* @ORMEntity(repositoryClass="AppBundleRepositoryPlaceRepository")
*/
class Place
{
/**
* @var int
*
* @ORMColumn(name="id", type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORMOneToMany(targetEntity="AppBundleEntityEvent", mappedBy="place")
*/
private $events;
}
和
class Event
{
/**
* @var int
*
* @ORMColumn(name="id", type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var DateTime
* @JMSType("DateTime<'H:i'>")
* @ORMColumn(name="event_starts", type="datetime")
*/
private $eventStarts;
/**
* @var DateTime
* @JMSType("DateTime<'Y/m/d H:i'>")
* @ORMColumn(name="event_ends", type="datetime", nullable=true)
*/
private $eventEnds;
/**
* @var string
*
* @ORMColumn(name="title", type="string", length=255)
*/
private $title;
/**
* @var string
*
* @ORMColumn(name="event_id", type="string", length=70)
*/
private $event_id;
/**
* @JMSExclude()
* @ORMManyToOne(targetEntity="Place")
* @ORMJoinColumn(name="place_id", referencedColumnName="id")
*/
private $place;
当我查询地点时,我希望不是所有事件都会被加入,而只会加入今天发生的事件(事件开始=今天)。有没有办法只用 Doctrine 或 MySQL 来做到这一点?
非常简单。
$qb = $this->getEntityManager()->createQueryBuilder();
如果您只想获取在特定日期范围内举办活动的地点:
$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();
如果您想获取所有地点,即使他们没有活动,但如果指定范围内有一个活动,请加入活动:
$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();