2017-02-15 34 views
0

在我现有的模型中,我有两个实体:StudentStudentOrdersHistory。我们使用历史记录表来记录学生的所有订单。Doctrine 2 - 引用特定的关联收集项目

但是,我们特别需要使用最新的订单历史。起初,我用像下面这样的一些循环引用:

StudentOrderHistory.student_id --> Student 

Student.latest_order --> StudentOrderHistory 

这样做的原因是,我们预期的关系,有数百行(学生在这里只是为了简单的问我需要一个例子),但由于我们大部分都需要与最后一个一起工作,我们认为它是毫无意义的加载所有这些,然后做一些$student->orders->last(),因为它必须加载所有记录。

不用说,这个实现在删除Student时带来了一种痛苦,因为循环引用不会让我在不必删除Student.latest_order引用的情况下执行此操作。

是否有无论如何我可以加载到一个Student财产(如Student::$latestOrder)只有最新的一个使用DQL吗?

回答

0

当然,但您可能无法直接通过Student对象执行此操作。牺牲这种便利性应该可以提高你想要的性能,事实上doctrine best practices建议尽可能地限制关系。

我还没有测试过这段代码,但你可能知道如何让它工作。我会在OrderRepository中添加一个方法,如

public function getLatestForStudent(Student $student) 
{ 
    $this->findOneBy(['student' => $student], ['created']); 
}