Как добавить пользовательские методы в красноречивую модель так, чтобы мы могли их связать? - PullRequest
0 голосов
/ 09 мая 2019

Я хочу добавить методы в красноречивые модели, чтобы я мог их связать, например:

class MovieResolver
{
    public function getMoviesFeaturingToday(array $args)
    {
        // Movie is an Eloquent model

        $movie = (new Movie())
            ->getMoviesFeaturingTodayOnTheater($args['movieTheaterId'])
            ->getBySessionCategory($args['sessioncategory']);

        // And keep doing some operations if necessary, like the code below.
        // I cannot call the get() method unless I finish my operations.

        return $movie->whereDate('debut', '<=', Carbon::today())
            ->orderBy('debut', 'desc')
            ->get();
    }
}

Но добавив эти методы в модель:

class Movie extends Model
{
    public function getMoviesFeaturingTodayOnTheater($theaterId)
    {
        return $this->whereHas(
            'sessions.entries.movieTheaterRoom',
            function ($query) use ($theaterId) {
                $query->where('movie_theater_id', $theaterId);
            }
        );
    }

    public function getBySessionCategory($sessionCategory)
    {
        return $this->whereHas(

        );
    }


}

В результате получимследующая ошибка:

вызов неопределенного метода Illuminate \ Database \ Eloquent \ Builder :: getMoviesFeaturingTodayOnTheater ()

Но почему?Что я делаю не так?

1 Ответ

3 голосов
/ 09 мая 2019

Это делается с помощью Области запросов . Поэтому попробуйте это в вашей модели:

public function scopeMoviesFeaturingTodayOnTheater($query, $theaterId)
{
    return $query->whereHas(
           'sessions.entries.movieTheaterRoom',
            function ($query) use ($theaterId) {
                $query->where('movie_theater_id', $theaterId);
            }
        );
}

public function scopeBySessionCategory($query, $sessionCategory)
{
     return $query->whereHas(
        // ...
     );
}

Затем, чтобы использовать его, вы делаете:

Movie::moviesFeaturingTodayOnTheater($args['movieTheaterId'])
    ->bySessionCategory($args['sessioncategory']);;
...