2014-09-05 70 views
0

我基本上有一个聊天实体,它由ManyToOne associatino链接到一个事件。所以一个聊天只能引用一个事件,但一个事件可以有多个聊天。 每个事件都有一个dateEnd,它指定事件在哪个日期结束。在Doctrine2的关联实体的日期时间字段上使用where条件?

基本上是:

class Chat 
{ 
    /** 
    * Bidirectional - Many Requests are associated to one Event (OWNING SIDE) 
    * 
    * @ORM\ManyToOne(targetEntity="Entity\Event", inversedBy="invitations") 
    */ 
    private $event; 
} 

,并在我的事件:

class Event 
{ 
    /** 
    * @var \DateTime 
    * 
    * @ORM\Column(name="date_end", type="datetime", nullable=true, unique=false) 
    */ 
    private $dateEnd; 


    /** 
    * Bidirectional - One-To-Many (INVERSE SIDE) 
    * 
    * @var \Doctrine\Common\Collections\Collection 
    * 
    * @ORM\OneToMany(targetEntity="Entity\Request", mappedBy="event", cascade={"remove"}) 
    */ 
    private $invitations; 
} 

我试图抓住尚未结束的事件。 但我不能有它的工作:

这工作:

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

    $qb->select('CHATS', 'messages') 
     ->from('Entity\Chat', 'CHATS') 
     ->where('CHATS.user = :user') 
     ->leftJoin('CHATS.messages', 'messages') 
     ->orderBy('CHATS.lastActive', 'DESC'); 

    $array = array(
     'user' => $user 
    ); 

    $qb->setParameters($array); 

    $newMessages = $qb->getQuery()->getResult(); 

这不工作,我不知道为什么:

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

    $qb->select('CHATS', 'messages') 
     ->from('Entity\Chat', 'CHATS') 
     ->where('CHATS.user = :user') 
     ->andWhere(
      $qb->expr()->gt('CHATS.event.dateEnd', ':yesterday') 
     ) 
     ->leftJoin('CHATS.messages', 'messages') 
     ->orderBy('CHATS.lastActive', 'DESC'); 


    //Only take notifs that end after the beggining of the day .. 
    $yesterday = new \DateTime('NOW', new \DateTimeZone('America/Los_Angeles')); 

    $array = array(
     'yesterday' => $yesterday, 
     'user' => $user 
    ); 

    $qb->setParameters($array); 

    $newMessages = $qb->getQuery()->getResult(); 

所以学说不喜欢在

->andWhere( $qb->expr()->gt('CHATS.event.dateEnd', ':yesterday') )

为什么?

很多感谢您的见解。

+2

在连接中添加CHATS.event(leftJoin('CHATS.event','event'),然后你可以在where条件 – JimL 2014-09-05 19:46:57

+0

中使用event.dateEnd。 为什么这样做? – 2014-09-06 01:04:21

+1

Your第一个查询只是返回聊天信息,当你调用$ chat-> getEvent()时,第二个查询会在后台启动以延迟加载事件,因此事件可能会自动链接到聊天,但事实并非如此。查询,Doctrine 2不够聪明,无法处理CHATS.event.dateEnd。因此需要明确加入,所以where子句可以工作。 – Cerad 2014-09-06 14:31:19

回答

1

你的第一个查询只是返回聊天。当您调用$ chat-> getEvent()时,会在幕后启动第二个查询以延迟加载事件。所以它可能看起来像事件自动链接到聊天,但事实并非如此。

在你的第二个查询中,Doctrine 2不够聪明,无法处理CHATS.event.dateEnd。因此需要明确的事件连接,所以where子句可以工作。

相关问题