我有三个模型,省,城市和工作。
省有以下内容:
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()
谢谢!
答案 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')...