У меня есть следующие красноречивые сущности:
- Фильм
- 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) '
Где я не прав?