Обновление 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:
Теперь то, что я хочу сделать, это получить 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'); } }