Laravel Многоразовые функции - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть таблица videos, в которой хранится информация о video, и другая таблица videoStats, в которой хранится сколько раз a. видео было просмотрено.

Я создаю Service с некоторыми пользовательскими методами в соответствии с требованиями приложения. Я не знаю, идеально ли это для создания нового сервиса или я могу использовать эти методы в самой модели. Если есть какой-то другой способ сделать это лучше, я был бы признателен за некоторые предложения.

У меня есть метод mostWatchedVideos, который возвращает список с watch_count и video_id для каждого видео.

Второй метод mostWatchedVideosBetween должен возвращать то же самое, что и mostWatchedVideos но за определенный период времени. Я могу повторить тот же код с дополнительным аргументом для даты ->whereBetween('createdAt', [$from, $till]), и это бы сработало, но я подумал о том, что, поскольку оба метода используют один и тот же код, есть ли способ повторно использовать метод, но с фильтр даты?

public static function mostWatchedVideosBetween(Carbon $from, Carbon $till)
{

}

public static function mostWatchedVideos($limit = NULL)
{
    return VideoStats::select(\DB::raw('count(*) as watch_count, videoId'))
                            ->groupBy('videoId')
                            ->orderBy('watch_count', 'DESC')
                            ->limit($limit)
                            ->get();
}

Ответы [ 2 ]

0 голосов
/ 27 февраля 2020

Я обычно использую условные Условные предложения . Для ie, если значение / с равно null, это приведет к false, и то, что находится внутри условия, не будет учитываться:

public static function mostWatchedVideos($limit = NULL, $from = null, $till = null)
{
    return VideoStats::select(\DB::raw('count(*) as watch_count, videoId'))
                            ->groupBy('videoId')
                            ->orderBy('watch_count', 'DESC')
                            ->when($limit, function ($query, $limit) {
                                 return $query->limit($limit);
                            })
                            ->when(($from && $till), function ($query, $from, $till) {
                                 return $query->whereBetween('date_column', [Carbon::parse($from), Carbon::parse($till)]);
                            })
                            ->get();
}
0 голосов
/ 27 февраля 2020

Вы можете написать метод, который возвращает общий запрос:

public static function getWatchCountQuery() {
    return VideoStats::select(\DB::raw('count(*) as watch_count, videoId'))
               ->groupBy('videoId')
               ->orderBy('watch_count', 'DESC');
}

И использовать его в других ваших методах:

public static function mostWatchedVideosBetween(Carbon $from, Carbon $till) {
    return $this->getWatchCountQuery()
               ->whereBetween('createdAt', [$from, $till])
               ->get();
}

public static function mostWatchedVideos($limit = NULL) {
    return $this->getWatchCountQuery()
               ->limit($limit)
               ->get();
}

И, на мой взгляд, логика c принадлежит в вашей модели. Не в сервисе.

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