Как получить полиморфный тип отношений при активной загрузке в Laravel Eloquent? - PullRequest
0 голосов
/ 24 сентября 2019

Запрашивая наличие или отсутствие полиморфных отношений, 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 и т. Д. Могут быть отключены или удалены.

1 Ответ

0 голосов
/ 24 сентября 2019

1- Соглашения об именах в Laravel гласят, что модели имеют единственную форму, поэтому вы можете рассмотреть возможность переименования моделей в Photo и Video и т. Д.

2- В вашем случае, Blogмодель не имеет реакции, поэтому вы можете создать type Scope в модели Feed, например:

public function scopeHasReactions($query)
{
    return $query->whereIn('reactable_type', ['App\Photo', 'App\Video']);
}

3 - использовать свойство $withCount для получения количества в модели Photo впример:

protected $withCount = ['reactions'];

Наконец, вы можете сделать запрос, подобный этому:

$feeds = Feed::hasReactions()->get();

$feeds->first()->reactions_count;

Надеюсь, это поможет.

...