2

我想计算属于某个标签的帖子数。我应该使用方法还是动态属性?

<?php

class Tag extends Eloquent {

    public function posts()
    {
        return $this->belongsToMany('Post');
    }

    public function postsCount()
    {
        return count($this->posts);
    }

    public function getPostsCountAttribute()
    {
        return count($this->posts);
    }

}

所以在模板中我应该使用动态属性:

{{ $tag->postCount }}

或方法:

{{ $tag->postCount() }}
4

1 回答 1

7

摘自 Laravel 4 关于 Eloquent 在关系中的动态属性(访问器)的文档(粗体是我的):

Eloquent 允许您通过动态属性访问您的关系。Eloquent 会自动为你加载关系,甚至可以很聪明地知道是调用 get(用于一对多关系)还是 first(用于一对一关系)方法。然后可以通过与关系同名的动态属性访问它。

也就是说,使用为数据库关系或动态属性(访问器)定义的方法将表现不同。

如果您使用以下方法发出帖子计数:

$count = $tag->posts()->count();

这将使用 COUNT 聚合函数生成正确的 SQL。

另一方面,如果您使用动态属性(访问器)发出帖子计数,如下所示:

$count = count($tag->posts);

这将获取所有帖子,将它们转换为对象数组,然后计算数组元素的数量。

在您的情况下,选择应取决于与标签相关的帖子的使用情况。如果您只想计数,则使用方法和聚合函数。但是,如果除了计数之外,您还要对这些帖子做其他事情,那么请使用动态属性(访问器)。

于 2013-07-31T16:26:51.490 回答