Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Laravel 父母,孩子,拉拉维尔孩子的孩子_Laravel_Laravel 4_Eloquent - Fatal编程技术网

Laravel 父母,孩子,拉拉维尔孩子的孩子

Laravel 父母,孩子,拉拉维尔孩子的孩子,laravel,laravel-4,eloquent,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'); } pub

我有三种模式,工作

具有以下特点:

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');
}
城市具有以下特点:

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');
}
作业具有以下功能:

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()

谢谢

这是因为城市是一个
集合
你必须循环遍历每一个城市,以获得工作编号并将其相加

控制器内部:如是

$job_count = 0;

$province->cities->each(function ($city) use ($job_count){
    $job_count += $city->jobs->count(); 
});
$job\u count
将等于每个it城市内的工作总数

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

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

您已经准备好在
elount
中使用解决方案,无需加载所有内容并对集合进行
count

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

$province->jobs()->count();
它运行simple
SELECT count(*)
,而不加载冗余集合

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

此外,如果您需要使用省集合,请使用以下方法:

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;
}
使用此功能,您可以一次轻松获得多个
省份的计数(仅执行2个查询):


谢谢你,马特。我正在努力获得该省而不是该市的就业总数。有什么建议吗?太好了!谢谢你的帮助,救了我一天!这可能会发出数十个/数百个查询来进行计数。“所以小心点,”拉斐尔说,“如果他想装的话,就别装了。”。而
->count()
Eloquent\Collection
上的一个方法,除非执行以下操作:
$city->jobs()->count()@MattBurrow,如果他真的想加载,就不会了。可能应该在回答中提到这一点。这里不是很确定,但是
$provice->cities()->jobs()->count()
可能会起作用,如果起作用,性能会更好。@Raphael_uu我之前也试过,但很遗憾没有起作用,给出了以下错误:调用未定义的方法illumb\Database\Query\Builder::jobs()