与Laravel雄辩的ORM中的'方法'与'动态属性'?

Sha*_*dow 2 laravel eloquent laravel-4

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

<?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);
    }

}
Run Code Online (Sandbox Code Playgroud)

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

{{ $tag->postCount }}
Run Code Online (Sandbox Code Playgroud)

或方法:

{{ $tag->postCount() }}
Run Code Online (Sandbox Code Playgroud)

Rub*_*zzo 6

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

Eloquent允许您通过动态属性访问您的关系.Eloquent会自动为您加载关系,甚至足够聪明,可以知道是调用get(一对多关系)还是第一个(一对一关系)方法.然后可以通过动态属性访问它,其名称与关系相同.

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

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

$count = $tag->posts()->count();
Run Code Online (Sandbox Code Playgroud)

这将生成具有COUNT聚合函数的正确SQL.

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

$count = count($tag->posts);
Run Code Online (Sandbox Code Playgroud)

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

在您的情况下,选择应取决于与标签相关的帖子的用法.如果您只想计算,则使用方法和聚合函数.但是,如果除了计算你将使用这些帖子做其他事情,然后使用动态属性(访问者).