У меня есть модели "Платеж", "Смета" и "Цитата", платеж имеет полиморфную связь, где он может принадлежать либо к котировке, либо к смете, одновременно в цитате может быть много оценок, поэтому смета всегда собирается принадлежат цитате.
По сути, все платежи всегда будут относиться к котировке, иногда напрямую, а иногда через оценку:
quotes:
id
estimates:
id
quote_id
payments:
id
paymentable_id
paymentable_type ("App\Models\Quote" or "App\Models\Estimate")
Мой вопрос заключается в том, как я могу определить отношения, чтобы при использовании $quote->payments
он возвращал не только платежи, непосредственно связанные с котировкой, но и платежи, связанные с оценками, принадлежащими этой цитате.
Какие-либо предложения? Заранее спасибо.
да, это возможно, вы можете попробовать что-то вроде ниже:
определить три вида отношения:
сначала для прямой оплаты следующим образом:
public function directPayments(){
return $this->morphMany(Payment::class,"paymentable");
}
и еще один для получения косвенных ссылок с помощью hasManyThrough:
/**
* returns models, not relation
*/
public function indirectPayments(){
return $this->hasManyThrough(
Payment::class,
Estimate::class,
'quote_id',
'paymentable_id',
'id',
'id')
->where('paymentable_type',"App\Models\Estimate");
}
и у вас может быть функция для их объединения
public function getPaymentsAttribute(){
//merge or union in collections
return $this->directPayments->union($this->indirectPayments()->get());
}
tnx для принятия/проголосования. если в моем ответе есть какие-либо синтаксические/семантические проблемы, такие как ()
, дайте мне знать. исправить мой ответ
Спасибо, похоже это лучшее решение