Подсчет нескольких моделей в Laravel - PullRequest
0 голосов
/ 04 января 2019

У меня есть несколько моделей: пользователь, трек, учебник, глава, урок и SolvedLesson.

Ниже приведено то, что я сделал для подсчета каждой модели.

$data = [
    'userCount' => \App\User::count(),
    'userRegisteredToday' => \App\User::whereCreatedAt(date('Y-m-d'))->count(),
    'trackCount' => \App\Models\Track::count(),
    'tutorialCount' => \App\Models\Tutorial::count(),
    'chapterCount' => \App\Models\Chapter::count(),
    'lessonCount' => \App\Models\Lesson::count(),
    'solvedLessonCount' => \App\Models\SolvedLesson::count(),
];

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

1 Ответ

0 голосов
/ 04 января 2019

Метод withCount позволяет подсчитать количество результатов для отношений модели.

Предполагая, что вы определили отношение один ко многим между моделями User и SolvedLesson:

// you can optionally alias the appended count attribute
$users = User::withCount('solvedLessons as solved_count')->get();

// total users
$users->count()

// iterate users to get the number of solved lessons for each
$users->each(function (User $user) {
    // using the alias defined above
    echo $user->solved_count;
});

Вы также не ограничены одним отношением, передавая массив, вы получите счетчик для каждого отношения:

$tracks = Track::withCount(['tutorials', 'users'])->get();

// total tracks
$tracks->count()

// access each relation count per track
$tracks->each(function (Track $track) {
    echo $track->tutorial_count;
    echo $track->user_count;
});
...