Я все еще изучаю 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)
Если ваши модели выглядят так.
Должно быть как:
$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);
Решение вашей проблемы — обновить ваш запрос следующим образом:
$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');