Сортировать вывод массива с помощью реляционной модели - PullRequest
0 голосов
/ 23 марта 2020

Я пытаюсь получить результаты массива вроде:

array:3 [▼
  0 => array:2 [▼
    "name" => "Sedan Car"
    "total" => 3089.0
  ]
  1 => array:2 [▶]
  2 => array:2 [▶]
]

Но, к сожалению, с моим кодом я получаю:

array:3 [▼
  0 => array:3 [▼
    "car_id" => 5
    "total" => 3089.0
    "vehicle_class" => array:13 [▼
      "id" => 5
      "type" => "Standard Car"
      "name" => "Sedan Car"

Мой контроллер:

$target = Invoice::select('car_id')
            ->selectRaw("SUM(total_price) AS total")
            ->with('vehicleClass')
            ->groupBy('car_id')
            ->get()
            ->toArray();

 dd($target);

    $data = \Lava::DataTable();
    $data->addStringColumn('Country')
              ->addNumberColumn('Popularity');
    foreach($target as $row){
        $data->addRow([$row['car_id'], $row['total'] ]);
        $ket["totalTarget"] += $row['total'];
    }
    \Lava::DonutChart('Don', $data, [
                'title' => $balanceT,
                'height' => '300',
                'is3D'   => true,
            ]);

Модель счета-фактуры:

public function vehicleClass()
{
    return $this->belongsTo(VehicleClass::class,'car_id');

}

Итак, мой вопрос, как взять значение имени из реляционной модели и добавить его в массив и получить SUM "total" столбца total_price

Чтобы было понятнее:

  1. Модель и таблица счета содержат [car_id, total_price]
  2. Модель транспортного средства и таблица содержит [name, ..etc]

    • Результаты, которые мне нужны [name, Sum [total_price]] name = card_id => в отношении modle

Заранее благодарю за помощь

1 Ответ

0 голосов
/ 23 марта 2020

Надеюсь, это поможет:

$Data = Invoice::select('car_id', 'total')
            ->selectRaw("SUM(total_price) AS total")
            ->with([
                'vehicleClass'=>function($q) {
                    $q->select('id', 'name');
                }
            ])->get();

dd($Data->first()->vehicleClass->name);

Извлечение данных так, как вам нужно, не представляется возможным, насколько мне известно, если вы не используете Laravel Мутаторы. Внутри Invoice добавьте следующее:

protected $appends = ['car_name', 'total_price'];

public function getCarNameAttribute($value)
{
    return $this->vehicleClass()->select('id', 'name')->first()->name;
}

public function getTotalPriceAttribute($value)
{
    return $this->selectRaw("SUM(total_price) AS total")->where('id', $this->id)->first()->total;
}

Затем, когда вы захотите получить название автомобиля, вы можете сделать следующее:

dd($Data->first()->car_name);
dd($Data->first()->total_price);
...