Получить все записи на основе типа модели в полиморфных отношениях
У меня есть 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();