簡體   English   中英

laravel eloquent 獲取所有關系數據

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM