我有一个名为Organization的模型,它与一个名为Client的模型有多对一的关系,它看起来像这样,
public function clients() {
return $this->hasMany('Client', 'owner_id')->orderBy('name', 'asc');
}
客户与这样的项目有一对多的关系,
public function projects()
{
return $this->hasMany('Project');
}
项目模型/表作为组织中的total_cost
列,我可以获取它的客户端,然后是客户项目,我想要做的是通过聚合所有客户项目获得客户的价值total_cost
条目,我试图用以下内容完成此操作,
public function clientsValue() {
return $this->clients()->projects()->select(DB::raw("SUM(total_cost) as client_value"));
}
在我看来,通过客户关系获取项目,然后在项目模型上运行select,但是我收到以下错误,
Call to undefined method Illuminate\Database\Query\Builder::projects()
但我不确定为什么客户有项目关系。
答案 0 :(得分:0)
$ this-> clients()返回关系定义 - 类 HasMany 的对象,而不是客户端对象。 HasMany 类没有 projects()方法,这就是您收到错误的原因。
为了计算客户总值,首先需要在组织和项目之间定义其他关系:
public function projects() {
return $this->hasManyThrough('Project', 'Client');
}
这将告诉Eloquent如何使用中间客户端模型获取给定组织的项目。
获得关系后,您可以在其上调用聚合函数:
public function clientsValue() {
return $this->projects()->sum('total_cost');
}
您可以在此处详细了解汇总功能:http://laravel.com/docs/5.1/queries#aggregates
您可以在此处详细了解 hasManyThrough 关系:http://laravel.com/docs/5.1/eloquent-relationships#has-many-through