试图在雄辩中聚合列值

时间:2015-12-21 21:42:09

标签: php laravel orm laravel-5 eloquent

我有一个名为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()

但我不确定为什么客户有项目关系。

1 个答案:

答案 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