Получить все записи на основе типа модели в полиморфных отношениях

У меня есть 3 модели и соответствующие таблицы: Firm, SaleFirm, PartnerFirm.

В Таблице фирм я хочу хранить общую информацию о фирмах, такую ​​как название, банковский счет, идентификатор и тому подобное. В двух других таблицах я буду хранить различную информацию в зависимости от типа фирмы (торговая фирма или партнерская фирма).

Из-за этой логики мне нужны полиморфные отношения один-к-одному между этими таблицами.

В моей таблице фирм у меня есть 2 столбца: firmable_id а также firmable_type.

Отношения между моделью фирмы и моделью сбытовой фирмы / партнерской фирмы следующие:

class Firm extends Model {
        public function firmable()
        {
                return $this->morphTo();
        }
}
class PartnerFirm extends Model {
        public function firm()
        {
                return $this->morphOne(Firm::class, 'firmable');
        }
}

Мои вопросы таковы: как я могу получить все записи на основе firmable_type, так на основе названия модели? Могу ли я сделать это, используя отношения, или мне нужно сделать что-то вроде этого:Firm::where('firmable_type','path\to\PartnerFirm')->get()?

2 ответа

Попробуй это:

$firms = Firm::whereHasMorph('firmable', [PartnerFirm::class])->get();

Это должно вывести такой запрос:

=> "выбрать * из firms где ((firmable_typeзнак равно и существует (выберите * изpartner_firms где firms.firmable_id знак равно partner_firms.id))) а также firms.deleted_at нулевой"

То, как это сделал Мирадж Хан, тоже должно работать:

$firms = Firm::whereHasMorph('firmable','App\PartnerFirm')->get();

Он выполнит тот же запрос:

=> "выбрать * из firms где ((firmable_typeзнак равно и существует (выберите * изpartner_firms где firms.firmable_id знак равно partner_firms.id))) а также firms.deleted_at нулевой"

В сообщенной вами ошибке:

Столбец не найден: 1054 Неизвестный столбец has_morph в предложении where

Вроде лечится методом whereHasMorph() как засахаренная версия where() один (where('has_morph', '...'))

Вы можете попробовать это, чтобы получить все ваши модели Morph, как показано ниже. Запрос полиморфных отношений

$PartnerFirm = Firm::whereHasMorph('firmable','App\PartnerFirm')->get();
Другие вопросы по тегам