Как получить несколько объединенных данных в одной функции DB Laravel

Обновление 3 (разрешено, но не оптимально)

Существует способ взломать результат:

public function loadRouteData($day, $week_nr, $year){ $route_data = Facturatie_Invoice::with('customer', 'invoice_lines') ->whereHas('route_manager', function ($query) use ($week_nr, $year) { $query->where(['week_nr' => $week_nr, 'year' => $year]); }) ->where('day', $day) ->get(); foreach($route_data as $rd){ for($i = 0; $i < count($rd->invoice_lines); $i++){ $product = DB::table('facturatie_product')->where('id', $rd->invoice_lines[$i]->product_id)->first(); $rd->invoice_lines[$i]->product = $product; } } return $route_data; } 

Я не думаю, что это самый оптимальный способ, поэтому, если кто-нибудь из вас знает лучший метод, пожалуйста, дайте мне знать.

Для деталей и вещей, которые я пробовал, см. Ниже.


У меня есть следующая ERD:

Моя ERD

Теперь то, что я хочу сделать, это получить Facturatie_Route_Manager с помощью:

 Facturatie_Invoice Facturatie_Customer Facturatie_Invoice_Line Facturatie_Product 

Теперь, когда я пытаюсь сделать следующее:

 public function loadRouteData($day, $week_nr, $year){ $route_data = DB::table('facturatie_route_manager') ->join('facturatie_invoice', 'facturatie_route_manager.invoice_id','=','facturatie_invoice.id') ->join('facturatie_customer', 'facturatie_invoice.customer_id','=','facturatie_customer.id') ->where(['facturatie_invoice.day' => $day, 'facturatie_route_manager.week_nr' => $week_nr, 'facturatie_route_manager.year' => $year]) ->get(); return $route_data; } 

Я получаю дубликаты записей для диспетчера маршрутов, потому что каждая новая строка счета не добавляется в одну запись, но вместо нее создается новая запись. Кроме того, потому что я не получаю желаемого результата, я еще не включил Facturatie_Product.

Есть идеи? Я использую Laravel 5+.

Я пробовал использовать модели из Facturatie_Route_Manager но, похоже, не Facturatie_Invoice id Facturatie_Invoice_Line invoice_id на Facturatie_Invoice_Line invoice_id начиная с модели Facturatie_Route_Manager . Я бы предпочел не использовать объединения, если это возможно.


Обновление 1

 public function loadRouteData($day, $week_nr, $year){ $route_data = Facturatie_Route_Manager::whereHas('invoice', function ($query) use ($day) { $query->where('day', $day); }) ->where(['week_nr' => $week_nr, 'year' => $year]) ->get(); return $route_data; } 

Теперь по-прежнему нужна связь между facturatie_invoice и facturatie_invoice_line и facturatie_invoice_line и facturatie_product.

Модель Facturatie_Route_Manager

 class Facturatie_Route_Manager extends Model { protected $table = 'facturatie_route_manager'; public function invoice(){ return $this->hasOne('App\Facturatie_Invoice', 'id', 'invoice_id'); } } 

Обновление 2

Может быть, проще смотреть из модели Facturatie_Invoice, потому что она имеет отношения «один к одному» с Facturatie_Route_Manager. Этот код приближается к конечному результату:

 public function loadRouteData($day, $week_nr, $year){ $route_data = Facturatie_Invoice::with('customer', 'invoice_lines') ->whereHas('route_manager', function ($query) use ($week_nr, $year) { $query->where(['week_nr' => $week_nr, 'year' => $year]); }) ->where('day', $day) ->get(); return $route_data; } 

Только по-прежнему нужна ссылка между Facturatie_Invoice_Line - product_id и Facturatie_Product - id

Модель Facturatie_Invoice

 class Facturatie_Invoice extends Model { protected $table = 'facturatie_invoice'; public function customer() { return $this->hasOne('App\Facturatie_Customer', 'id', 'customer_id'); } public function invoice_lines() { return $this->hasMany('App\Facturatie_Invoice_Line', 'invoice_id', 'id'); } public function route_manager() { return $this->hasOne('App\Facturatie_Route_Manager', 'invoice_id', 'id'); } }