laravel eloquent获取所有关系数据

时间:2017-10-23 15:04:16

标签: laravel eloquent

我在Laravel中有以下设置 - 一个可以包含许多包含许多行数据的报告的客户端

客户端对象(可以有很多报告)

class Client extends Model
{
    public function reports()
    {
      return $this
        ->belongsToMany('App\Report')
        ->withTimestamps();
    }
}

报告对象(可以包含多行数据)

class Report extends Model
{
    public function data()
    {
      return $this
        ->belongsToMany('App\Data', 'report_data')
        ->withTimestamps();
    }
}

数据对象(属于报告)

class Data extends Model
{

    public function report()
    {
      return $this
        ->belongsTo('App\Report')
        ->withTimestamps();
    }

}

如果我想为客户端获取报告,我可以这样做(如果我想抓住第一个):

$report = $client -> reports -> first();
var_dump($report -> data); die;

这将为我提供第一份报告的所有数据

或者:

foreach($client -> reports as $report){
     var_dump($report -> data);
}

现在的问题是 - 如果一个客户有3个报告我怎样才能获得这3个报告的所有数据?

因此,例如,如果客户有3个报告,如:

Report 1
Name: test
View: 100
Revenue: 10

Report 2
Name: foo
Views: 50
Revenue: 30

Report 3
Name: bah
Views: 40
Revenue: 20

我们可以得到:

Name: Total
Views: 190
Revenue: 60

我已经尝试循环遍历报告并将它们合并到一个集合中但它不起作用

  $reports = $client -> reports -> all();

  $collection = new \Illuminate\Database\Eloquent\Collection;

  foreach($reports as $report){

      $collection = $collection -> merge($report -> data);
  }

  var_dump($collection);
  die;

这种关系让我有点难过

2 个答案:

答案 0 :(得分:1)

在Laravel中,您可以使用Eager Loading来获取包含相关数据的模型。如果您已拥有该模型并希望获得相关数据,则可以使用延迟加载

$client->load('reports.data');

之后,您可以使用

检查内容
dd($client);

要获得总观看次数,您可以

$totalViews = $client->reports->sum('views');

由于您将使用Collections

您将看到填充了所有报告的relations字段,并在其中显示每个报告的所有数据结果。

修改

如果您想在一个地方使用所有数据,可以使用

$allData = $client->reports->pluck('data');

另外,请记住,Laravel可能拥有模型中保留的属性data,因此如果您继续遇到麻烦,请尝试更改reportData和模型{{1}之类的关系名称}}

答案 1 :(得分:0)

试试这个

$reports = [];
foreach($client -> reports as $report){
     $reports [] = $report->data;
}
var_dump($reports);