Как получить все фильмы, которые играют на MovieTheater? - PullRequest
3 голосов
/ 09 апреля 2019

У меня есть следующие красноречивые сущности:

  • Фильм
  • MovieSession
  • MovieTheater
  • MovieTheaterRoom

Структура таблицы:

Schema::create('movies', function (Blueprint $table) {
    $table->increments('id');
});

Schema::create('movie_theaters', function (Blueprint $table) {
    $table->increments('id');
    $table->string('name')->index();
    $table->string('slug')->index()->unique();
    $table->string('description')->index()->nullable();
    $table->longText('content')->nullable();

    $table->unsignedInteger('picture_id')->nullable();
    $table->foreign('picture_id')
         ->references('id')
         ->on('media');

    $table->boolean('activated')->default(true);

    $table->timestamps();
});

Schema::create('movie_theater_rooms', function (Blueprint $table) {
    $table->increments('id');
    $table->string('name')->index();
    $table->string('description')->index()->nullable();
    $table->longText('content')->nullable();

    $table->boolean('activated')->default(true);

    $table->unsignedInteger('movie_theater_id');
    $table->foreign('movie_theater_id')
        ->references('id')
        ->on('movie_theaters')
        ->onDelete('cascade');

    $table->unsignedInteger('picture_id')->nullable();
    $table->foreign('picture_id')
        ->references('id')
        ->on('media');

    $table->timestamps();
});

Schema::create('movie_sessions', function (Blueprint $table) {
    $table->increments('id');

    $table->dateTime('starts_in');
    $table->dateTime('ends_in');

    $table->unsignedInteger('movie_theater_room_id');
    $table->foreign('movie_theater_room_id')
        ->references('id')
        ->on('movie_theater_rooms')
        ->onDelete('cascade');

    $table->unsignedInteger('movie_id');
    $table->foreign('movie_id')
        ->references('id')
        ->on('movies')
        ->onDelete('cascade');

    $table->boolean('activated')->default(true);

    $table->timestamps();
});

где MovieTheater имеет много MovieTheaterRoom с, каждый MovieTheaterRoom имеет много MovieSession с, и каждый MovieSession принадлежит к Фильм .

Я пытаюсь получить все Movie s, которые сегодня воспроизводятся на MovieTheater его $movieTheaterId, но так как это долгая связь, я ' Я не могу получить такую ​​коллекцию.

Вот что я пробовал:

public function scopeGetMoviesShowingTodayOnMovieTheater($movieTheaterId)
{
    return Movie::whereHas('sessions', function ($query) use ($movieTheaterId) {
        // $query->whereDate('starts_in', Carbon::today());

        $query->whereHas('movieTheaterRoom', function ($query) use ($movieTheaterId) {
            $query->where('movie_theater_id', $movieTheaterId);
        });
    });
}

При звонке App\Models\Movie::getMoviesShowingTodayOnMovieTheater(1)->get() вот что я получил:

PHP Исправимая фатальная ошибка: объект класса Illuminate / Database / Eloquent / Builder не может быть преобразован в строку в ... / vendor / litate / support / Str.php в строке 338

Я также пытался использовать этот пакет staudenmeir/eloquent-has-many-deep так:


class MovieTheater extends Model {
    use HasRelationships;

    public function movies()
    {
        return $this->hasManyDeep(Movie::class, [MovieSession::class, MovieTheaterRoom::class]);
    }
}

А при звонке App\Models\MovieTheater::find(1)->movies()->get()

Это вывод:

Подсветка / База данных / QueryException с сообщением «SQLSTATE [42S22]: столбец не найден: 1054 Неизвестный столбец« movie_sessions.movie_theater_id »в« списке полей »(SQL: выберите movies. *, movie_sessions. movie_theater_id с movies внутреннее соединение movie_theater_rooms на movie_theater_rooms. id = movies. movie_theater_room_id внутреннее объединение movie_sessions на movie_sessions. id = movie_theater_rooms. movie_session_id где movie_sessions . movie_theater_id = 1) '

Где я не прав?

Ответы [ 2 ]

1 голос
/ 09 апреля 2019

Исключение

Объект класса Illuminate / Database / Eloquent / Builder не может быть преобразован в строку в ... / vendor / освещения / support / Str.php в строке 338

выброшено, потому что вы не указали параметр $ query в определении своей области.Ваш код попытается преобразовать идентификатор кинотеатра в экземпляр Builder, что не удалось.

Попытайтесь изменить свой код следующим образом:

/**
 * Scope a query to only select movies that are showing in a certain theater.
 *
 * @param  \Illuminate\Database\Eloquent\Builder  $query
 * @param  int  $movieTheaterId
 * @return \Illuminate\Database\Eloquent\Builder
 */
public function scopeGetMoviesShowingTodayOnMovieTheater($query, $movieTheaterId)
{
    return $query
        ->whereHas('sessions.movieTheaterRoom', function ($query) use 
        ($movieTheaterId) {
            $query->whereMovieTheaterId($movieTheaterId);
        });
}

Я также добавил точечную нотацию в операторе whereHas для запроса вложенного отношения.

0 голосов
/ 09 апреля 2019

Если вы хотите использовать staudenmeir/eloquent-has-many-deep, сделайте заказ следующим образом

class MovieTheater extends Model {
    use HasRelationships;

    public function movies()
    {
        return $this->hasManyDeep(Movie::class, [MovieTheaterRoom::class, MovieSession::class]);
    }
}

Пример заказа: enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...