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

Обновление 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_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');
    }
}

person Lars Mertens    schedule 23.06.2017    source источник
comment
Ознакомьтесь с отношениями в Laravel: laravel.com/docs/5.4/eloquent-relationships   -  person Marcin    schedule 23.06.2017