![](/img/trans.png)
[英]Laravel Eloquent - Get Eloquent Relationship Model Data From nested Relationship
[英]laravel eloquent get all relationship data
我在 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;
這段關系讓我有點難受
在 Laravel 中,您可以使用Eager Loading來獲取具有相關數據的模型。 如果你已經有了模型並且想要它的相關數據,你可以使用延遲加載
$client->load('reports.data');
之后,您可以檢查內容
dd($client);
為了獲得總觀看次數,您可以這樣做
$totalViews = $client->reports->sum('views');
由於您將使用Collections
您將看到relations
字段中填充了所有報告,其中包含每個報告的所有數據結果。
編輯
如果您想將所有數據集中在一個地方,您可以使用
$allData = $client->reports->pluck('data');
另外,請記住,Laravel 可能在模型中保留了屬性data
,因此如果您仍然遇到問題,請嘗試更改諸如reportData
和模型ReportData
類的關系名稱。
嘗試這個
$reports = [];
foreach($client -> reports as $report){
$reports [] = $report->data;
}
var_dump($reports);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.