Laravel используя красноречивый счет с помощью - PullRequest
0 голосов
/ 26 мая 2020

У меня есть две переменные: $customers (которая содержит все строки) и $total, которая содержит все строки запроса.

Обычно я делаю следующий запрос:

$customers = Customers::select
(
    'customer.id', 
    'customer.name', 
    'customer.min_tolerance',
    DB::raw('(SELECT MAX(tolerance) FROM customers_tolerances WHERE customer_id = customer.id) AS tolerance')
)
->from('customers AS customer')
->whereIn('customer.id', $request->customers);

$total = $customers->count();

$customers = $customers->limit($request->limit)
    ->offset($request->offset)
    ->get();

Отлично работает. Я ограничиваю все строки (обычно 20 на страницу) плюс общее количество строк.

Моя проблема в том, что я добавил предложение having в свой запрос, поэтому теперь он выглядит так:

$customers = Customers::select
(
    'customer.id', 
    'customer.name', 
    'customer.min_tolerance',
    DB::raw('(SELECT MAX(tolerance) FROM customers_tolerances WHERE customer_id = customer.id) AS tolerance')
)
->from('customers AS customer')
->whereIn('customer.id', $request->customers)
->havingRaw('tolerance >= customer.min_tolerance');

И $count перестал работать, так как он вызывает ошибку:

Столбец не найден: 1054 Неизвестный «допуск» столбца в «имеющем предложении» select count(*) as aggregate from customers as customer having tolerance >= customer.min_tolerance)

Итак, как я могу использовать count с предложением having ?

1 Ответ

0 голосов
/ 26 мая 2020

Решено .

Перед тем, как создать этот пост, я попытался создать подзапрос, как показано ниже:

SELECT COUNT(*) FROM (SELECT ...)

Но медлительность запроса была слишком большой, поэтому я попытался найти ответы здесь. Медленность была связана с отсутствием индекса в таблицах.

Добавив ALTER TABLE customers_tolerances ADD INDEX(customer_id);, я теперь могу быстро получить общие результаты.

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