Laravel красноречиво делают несколько подсчетов в отношениях - PullRequest
1 голос
/ 15 апреля 2020

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

    $subscribedAudits = Audit::whereHas('users', function ($query) {
        $query->whereIn('user_id', [Auth::user()->id])->where('approved', 1);
    })->withCount(['users' => function($query) {
        $query->where('approved', 0);
    }])->with(['users'])->get();

Это создает поле для результата с именем users_count с числом пользователей, где утверждено = 0. Это ожидаемый результат.

Теперь я хочу подсчитать другое поле в таблице пользователей, но я не уверен, как включить это в запрос Eloquent. Я попробовал следующее:

    $subscribedAudits = Audit::whereHas('users', function ($query) {
        $query->whereIn('user_id', [Auth::user()->id])->where('approved', 1);
    })->withCount(['users' => function($query) {
        $query->where('approved', 0);
    }])->withCount(['users' => function($query) {
        $query->where('viewed', 0);
    }])->with(['users'])->get();

Это не сработает, поскольку он может вернуть только 1 атрибут с именем users_count.

Есть ли способ обойти это без выполнения другого запроса?

Ответы [ 2 ]

2 голосов
/ 15 апреля 2020

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

Model::withCount([
    'relationship as count_1' => function ($query) {
        $query->where('active', 1);
    },
    'relationship as count_2' => function ($query) {
        $query->where('active', 0);
    }
]);

В вашем случае это будет примерно так:

$subscribedAudits = Audit::whereHas('users', function ($query) {
    $query->whereIn('user_id', [Auth::user()->id])->where('approved', 1);
})->withCount([
    'users as disapproved_count' => function ($query) {
        $query->where('approved', 0);
    },
    'users as not_viewed_count' => function ($query) {
        $query->where('viewed', 0);
    }
])->with(['users'])->get();
0 голосов
/ 15 апреля 2020

Агрегатные функции иногда обрабатываются не так, как ожидалось Eloquent. Я предлагаю использовать selectRaw('count() FILTER (WHERE)') вместо.

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