【问题标题】:How to efficiently count related rows within a model using Doctrine2如何使用 Doctrine2 有效地计算模型中的相关行
【发布时间】:2011-12-14 18:26:52
【问题描述】:

我对 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-orm


    【解决方案1】:

    Doctrine 2 会自动为您获取计数,因为关联属性实际上是 Doctrine Collection 对象:

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

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

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

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

    【讨论】:

    • 很好,我马上去看看。我实际上也只使用 Doctrine 2.0,所以可能也需要更新我的代码。
    • 我刚刚发现你可以直接使用count($house->getRooms())。这将正确添加单个 COUNT 查询。另见:stackoverflow.com/questions/15645911/…
    • 在其中添加 WHERE 的最佳方法是什么?即,计算容量 > 2 或类似的房间?正在为此苦苦挣扎。
    • @JacobManser 我不再了解最新的学说,但看起来你可以在这里找到答案:docs.doctrine-project.org/en/latest/reference/…
    猜你喜欢
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 2019-09-09
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2011-06-07
    相关资源
    最近更新 更多