Можно ли определить полиморфные отношения по разным путям (промежуточная модель) в моделях Laravel?

У меня есть модели "Платеж", "Смета" и "Цитата", платеж имеет полиморфную связь, где он может принадлежать либо к котировке, либо к смете, одновременно в цитате может быть много оценок, поэтому смета всегда собирается принадлежат цитате.

По сути, все платежи всегда будут относиться к котировке, иногда напрямую, а иногда через оценку:

quotes:
    id 

estimates:
    id
    quote_id 

payments:
    id 
    paymentable_id 
    paymentable_type ("App\Models\Quote" or "App\Models\Estimate")

Мой вопрос заключается в том, как я могу определить отношения, чтобы при использовании $quote->payments он возвращал не только платежи, непосредственно связанные с котировкой, но и платежи, связанные с оценками, принадлежащими этой цитате.

Какие-либо предложения? Заранее спасибо.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

да, это возможно, вы можете попробовать что-то вроде ниже:

определить три вида отношения:

сначала для прямой оплаты следующим образом:

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());
}

Спасибо, похоже это лучшее решение

Eliezer Gallego 14.12.2020 03:57

tnx для принятия/проголосования. если в моем ответе есть какие-либо синтаксические/семантические проблемы, такие как (), дайте мне знать. исправить мой ответ

Abilogos 14.12.2020 12:43

Другие вопросы по теме