我基本上有一个聊天实体,它由ManyToOne关联链接到一个事件。因此,一个聊天只能指一个事件,但一个事件可以有多个聊天。每个事件都有一个dateEnd,用于指定事件结束的日期。
基本上:
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();
所以Doctrine不喜欢
->andWhere(
$qb->expr()->gt( 'CHATS.event.dateEnd', ':yesterday' )
)
为什么?
非常感谢您的真知灼见。
您的第一个查询只返回聊天。当您调用$chat->getEvent()时,会在后台启动第二个查询来延迟加载事件。所以,这个事件看起来像是自动链接到聊天,但事实并非如此。
在您的第二个查询中,Doctrine 2不够聪明,无法处理CHATS.event.dateEnd。因此,需要一个显式事件联接,以便where子句可以工作。