在Doctrine2的关联实体的datetime字段中使用where条件?

时间:2014-09-05 19:43:53

标签: php sql join doctrine-orm dql

我基本上有一个Chat实体,它由ManyToOne associatino链接到一个事件。所以一个聊天只能引用一个事件,但一个事件可以有多个聊天。 每个事件都有一个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();

所以学说并不喜欢

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

为什么?

非常感谢您的见解。

1 个答案:

答案 0 :(得分:1)

您的第一个查询只会返回聊天记录。当您调用$ chat-> getEvent()时,第二个查询将在幕后启动以延迟加载事件。因此,似乎事件自动链接到聊天,但事实并非如此。

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