我在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;
这种关系让我有点难过
答案 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);