Laravel Eloquent глубокий вложенный запрос

Я все еще изучаю Laravel и не могу найти решение этой проблемы.
Мне нужно получить счета (с расходами), которые относятся к конкретному типу партнера.

Я попробовал это:

$p = Project::with(['invoices.partner.partnerType' => function($query){
$query->where('partnerTypeName', 'Lieferant');
}, 'expenses'
])->where('id', $id)
->first();

Я хочу выбрать счета для Lieferant, но я получаю все счета для одного проекта.

Модель проекта:

public function invoices()
{
return $this->hasMany('App\Invoice');
}

Модель счета

public function expenses()
{
return $this->hasMany('App\Expense');
}
public function partner()
{
return $this->belongsTo('App\Partner');
}

Модель партнера

public function partnerType()
{
return $this->belongsTo('App\PartnerType');
}

Изменить: модель PartnerType

public function partners()
{
return $this->hasMany('App\Partner');
}

Редактировать 2: База данных

Partner(partnerID, name, partnerTypeId)
PartnerType(partnerTypeId, partnerTypeName)
Project(projectID, name)
Invoice(invoiceID, name, projectID, partnerID)
Expenses(expenseID, invoiceID)

0

Решение

Если ваши модели выглядят так.
Должно быть как:

$p = Project::with(['invoices' => function($query){
$query->where('partnerTypeName', 'Lieferant')
->with(['expenses','partner' => function($q){
$q->with('partnerType');
}]);
}])->where('id', $id)
->first();

return dd($p);
0

Другие решения

Решение вашей проблемы — обновить ваш запрос следующим образом:

$p = Project::with(['invoices' => function($query){
$query->with('expenses')->whereHas('partner.partnerType', function($q){
$q->where('partnerTypeName', 'Lieferant');
});
}])
->where('id', $id)
->first();

Но более чистое решение будет использовать scope для вашей проблемы.

В вашей модели счета.

// Invoice.php
public function scopeByPartnerType($query, $partnerType)
{
$query->whereHas('partner.partnerType', function($q) use ($partnerType) {
$q->where('partnerTypeName', $partnerType);
});
}

А затем в вашей модели проекта добавьте еще одно отношение, которое будет просто получать Счета с определенным типом партнера.

// Project.php
public function lieferantInvoices()
{
return $this->hasMany('App\Invoices')->byPartnerType('Lieferant');
}

Теперь вы можете сделать это:

$project->find($id)->load('lieferantInvoices');
0

По вопросам рекламы [email protected]