父母,孩子,孩子的孩子在Laravel

时间:2014-11-20 13:09:02

标签: laravel laravel-4 eloquent

我有三个模型,城市工作

有以下内容:

public function cities() {
    return $this->hasmany('City');
}

城市有以下内容:

public function province() {
    return $this->belongsTo('Province', 'province_id');
}

public function jobs() {
    return $this->hasmany('Job');
}

作业具有以下内容:

public function city() {
    return $this->belongsTo('City', 'city_id');
}

我正在尝试获取每个省的工作总数,以下情况不起作用。如果有人能够指出我做错了什么会很感激吗?

$province->cities->jobs->count()

谢谢!

2 个答案:

答案 0 :(得分:2)

您在Eloquent中拥有现成的解决方案,无需加载所有内容并在集合中添加count

// Province
public function jobs()
{
  return $this->hasManyThrough('Job', 'City');
}

然后只是:

$province->jobs()->count();

它运行简单SELECT count(*)而不加载冗余集合。


此外,如果您需要急切加载省份集合,请使用此:

public function jobsCount()
{
    return $this->jobs()->selectRaw('count(*) as aggregate')->groupBy('province_id');
}

public function getJobsCountAttribute()
{
    if ( ! array_key_exists('jobsCount', $this->relations)) $this->load('jobsCount');

    return $this->getRelation('jobsCount')->first()->aggregate;
}

通过此功能,您可以轻松获得多个provinces的计数(仅执行2次查询):

$provinces = Province::with('jobsCount')->get();

foreach ($provinces as $province)
{
  $province->jobsCount;
}

答案 1 :(得分:0)

这是因为城市是Collection,你必须遍历每个城市才能获得作业编号并将其添加。

在控制器内:像这样;

$job_count = 0;

$province->cities->each(function ($city) use ($job_count){
    $job_count += $city->jobs->count(); 
});

$job_count将等于每个城市中的工作总数。

请注意:请务必加载关系数据,以减少对数据库进行的查询。

$province = Province::with('cities', 'cities.jobs')...