Запрашивая наличие или отсутствие полиморфных отношений, Laravel Eloquent предоставляет методы whereHasMorph
и whereDoesntHaveMorph
, которые действительно полезны для создания запросов, связанных с типами.Но как насчет энергичных нагрузок?
Вот ситуация:
Подумайте о 3 моделях Приложение \ Фотографии , Приложение \ Видео и App \ Blogs .
Все эти три модели могут быть загружены, что означает, что они имеют полиморфную связь с App \ Feed моделью.
Но пока Модели App \ Photos и App \ Videos реагируемы (имеют полиморфную связь с моделью App \ Reactions ), модель App \ Blogs не имеетесть эти отношения.
Давайте проверим методы:
App \ Feed
public function feedable() {
return $this->morphTo();
}
App \ Reactions
public function reactable() {
return $this->morphTo();
}
Приложение \ Фотографии
public function feed() {
return $this->morphOne('App\Feed', 'feedable');
}
public function reactions() {
return $this->morphMany('App\Reactions', 'reactable');
}
Приложение \ Видео
public function feed() {
return $this->morphOne('App\Feed', 'feedable');
}
public function reactions() {
return $this->morphMany('App\Reactions', 'reactable');
}
Приложение \ Блоги
public function feed() {
return $this->morphOne('App\Feed', 'feedable');
}
При запросе каналов из модели App \ Feed я также хочу получить количество реакций.Но из-за того, что модель App \ Blogs не имеет метода с именем reactions
, этот запрос вызывает ошибки.
Как создать запрос, подобный следующему:
$feeds = Feed::with([
'feedable' => function($query) {
// I need to get the feedable_type of the feedable here.
// module_exists is a custom helper to check if an module is installed and active
if ($type != 'App\Blogs' && module_exists('Reactions')) {
$query->withCount('reactions');
}
}
])->all();
Редактировать
Я попытался упростить свой вопрос, но думаю, что мне нужно предоставить больше информации о приложении.
Приложение представляет собой систему управления контентом (система социальной сети), для чего сторонние разработчики могут разрабатывать модули.Блоги, фотографии, видео, лента новостей, комментарии, комментарии, публикация и т. Д. - это разные модули, которые могут быть отключены или удалены владельцами сайта.Поэтому, когда разработчики создают модули, они должны учитывать, что модули Reactions, Coments и т. Д. Могут быть отключены или удалены.