Laravel select () возвращает пустое значение с полиморфным отношением и перекрестным соединением - PullRequest
0 голосов
/ 23 октября 2019

У меня есть 4 таблицы: tv_shows, tv_show_episodes, languages и languageables

У каждого телешоу может быть много языков по полиморфным отношениям. И я намерен фильтровать телешоу по языкам. тем временем я также сортирую телешоу по дате эфира.

TvShow::select([
    'tv_shows.*',
    'tv_show_episodes.id as episode_id',
    'tv_show_episodes.name as episode_name',
    'tv_show_episodes.air_date as episode_air_date',
    'tv_show_episodes.season_number',
    'tv_show_episodes.episode_number',
    'tv_show_episodes.still_path',
])
->crossJoin('tv_show_episodes', 'tv_shows.id', '=', 'tv_show_episodes.tv_show_id')
->whereRaw('timestamp(concat(tv_show_episodes.air_date, " ", tv_shows.airs_time)) <= NOW()')
->orderByRaw('timestamp(concat(tv_show_episodes.air_date, " ", tv_shows.airs_time)) DESC')
->when($request->has('languages'), function($query) {
    $query->whereHas('languages', function (Builder $query) {
        $query->whereIn('iso_639_1', explode(',', request('languages')));
    });
})->paginate(10)

TvShow.php

public function languages()
{
    return $this->morphToMany(Language::class, 'languageable');
}

В конце я делю их на 10. Когда я вижу, что total в порядке и возвращает правильное значение. но data всегда пусто.

{
    "current_page":1,
    "data":[],
    "from":null,
    "last_page":1760,
    "per_page":10,
    "to":null,
    "total":17600
}

И что интересно, когда я удаляю метод select() из вышеприведенного запроса, все идет хорошо.

Мне нужна информация об этих эпизодах рядом с телешоу. и я хочу знать, в чем причина этого?

1 Ответ

1 голос
/ 23 октября 2019

Попробуйте ответ ниже:

  TvShow::selectRaw('`tv_shows`.*, `tv_show_episodes`.`id` as `episode_id`, `tv_show_episodes`.`name` as `episode_name`, `tv_show_episodes`.`air_date` as `episode_air_date`, `tv_show_episodes`.`season_number`, `tv_show_episodes`.`episode_number`, `tv_show_episodes`.`still_path`')
->crossJoin('tv_show_episodes', 'tv_shows.id', '=', 'tv_show_episodes.tv_show_id')
->whereRaw('timestamp(concat(tv_show_episodes.air_date, " ", tv_shows.airs_time)) <= NOW()')
->orderByRaw('timestamp(concat(tv_show_episodes.air_date, " ", tv_shows.airs_time)) DESC')
->when($request->has('languages'), function($query) {
    $query->whereHas('languages', function (Builder $query) {
        $query->whereIn('iso_639_1', explode(',', request('languages')));
    });
})->paginate(10)

Здесь TvShow - ваша модель. надеюсь, это поможет вам.

...