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