我对Doctrine还是很陌生,想知道如何有效地计算特定模型对象的相关对象的数量。

我阅读here时说,在模型中使用实体管理器不是一个好主意,因此我想知道如何查询数据库以查找而不延迟加载所有相关模型并执行count()。

我还没有找到一个很好的答案,但这似乎是一件非常基本的事情?

例如

class House
{
    /**
     * @var Room
     */
    protected $rooms

    public function getRoomCount()
    {
        // Cant use entity manager here?
    }
}

class Room
{
    // Shed loads of stuff in here
}

最佳答案

由于关联属性实际上是Doctrine Collection对象,Doctrine 2将自动为您计数:

public function getRoomCount()
{
    return $this->rooms->count();
}

如果您将关联标记为渴望,则当您查询房屋实体时,Doctrine将加载房间。如果将它们标记为“懒惰”(默认设置),则在您实际访问$this->rooms属性之前,Doctrine不会加载房间。

从Doctrine 2.1开始,您可以将关联标记为“懒惰”。这意味着调用$this->rooms->count()不会加载房间,它只会向数据库发出COUNT查询。

您可以在此处阅读有关多余的惰性集合的信息:http://www.doctrine-project.org/docs/orm/2.1/en/tutorials/extra-lazy-associations.html

10-07 13:59
查看更多