返回关系计数以及父数据

时间:2015-09-11 17:35:32

标签: laravel laravel-5 eloquent

您好我的数据库中有两个表:

  1. 类别
  2. 事件
  3. 我有一个显示所有类别列表的页面。但是,我想显示类别标题旁边每个类别中有多少事件的计数。 例如:

    1. 喜剧(10)
    2. music(5)
    3. 这两个模型之间的关系是一对多,因为一个类别可以有零或更多事件。

      我的问题是,当我执行此代码时,如何获取每个类别的事件总数以及类别数据:

      $categories = Category::get();
      

      到目前为止我尝试了什么:

      class Categories extends Model implements SluggableInterface
      {
          use SluggableTrait;
      
          protected $sluggable = [
              'build_from' => 'name',
              'save_to'    => 'slug',
              'on_update'  => true,
          ];
      
          protected $table = 'categories';
      
          public function events() {
              return $this->hasMany('App\Models\Events', 'category_id');
          }
      
          public function eventsCountRelation() {
              return $this->hasMany('App\Models\Events', 'category_id')->selectRaw('id, count(*) as count');
          }
      
          public function eventsCountAttribute() {
              return $this->eventsCountRelation->count();
          }
      }
      

      我得到的错误: enter image description here

1 个答案:

答案 0 :(得分:1)

foreach($categories as $categoriy) {
    echo $category->name.' ('.$category->events->count().')';
}

返回类似的内容:     喜剧(10)     音乐(5)

如果要在视图中打印它,则无需在控制器中加载它们。 但是如果你想把它打印成json,你需要这样的东西:

$categories = Category::all();

在类别模型中,您需要添加以下内容:

protected $appends = ['counter'];

public function getCounterAttribute() {
    return $this->events->count();
}

像这样更新您的课程:

class Categories extends Model implements SluggableInterface
{
    use SluggableTrait;

    protected $sluggable = [
        'build_from' => 'name',
        'save_to'    => 'slug',
        'on_update'  => true,
    ];

    protected $appends = [
        'counter'
    ];

    protected $table = 'categories';

    public function events() {
        return $this->hasMany('App\Models\Events', 'category_id');
    }

    public function eventsCounterAttribute() {
        return $this->events->count();
    }
}

您不需要更多。