Я уверен, что вы используете paginate()
в своем коде, а не get()
, как вы написали. И когда Laravel генерирует необходимые данные для разбивки на страницы, он переопределяет часть SELECT
вашего утверждения с помощью:
SELECT count(*) as aggregate
Используется для подсчета итоговых записей. Это очень очевидно из SQL-части вашего сообщения об ошибке:
SQL: выберите количество (*) в качестве совокупности из внутреннего объединения облачных подписок
Это, конечно, перезаписывает ваше определение псевдонима no_of_service
, которое больше не может быть найдено в вашем выражении HAVING
, когда общий счетчик выполняется пагинатором.
Чтобы обойти это, вы можете использовать агрегатную функцию непосредственно в вашем операторе HAVING
без псевдонима:
$subscribers = Cloudsubscriptions::join("service_package",
"cloudsubscriptions.package_id", "=", "service_package.id")
->select(
"cloudsubscriptions.msisdn",
"cloudsubscriptions.service_name",
"service_package.title",
DB::raw("COUNT(cloudsubscriptions.msisdn) as 'no_of_service'"))
->groupBy("cloudsubscriptions.msisdn", "service_package.title")
// Use the COUNT aggregate function here as well
->havingRaw('COUNT(cloudsubscriptions.msisdn) > 1')
->get();
Это немного раздражает, когда приходится дублировать эту логику, но, по крайней мере, вы можете использовать Laravel Pagination , что намного больше.
ВАЖНОЕ ПРИМЕЧАНИЕ! Обязательно используйте привязки с havingRaw
и другими необработанными методами , если значение поступает из пользовательского ввода.
UPDATE
Поскольку вы используете Eloquent в качестве отправной точки для вашего запроса, вы можете использовать этот замечательный пакет от Roy Duineveld , который устраняет проблему, присутствующую в paginator. и позволяет использовать псевдоним в вашем выражении HAVING
. Вы можете использовать его, просто включив черту в вашу модель:
use Illuminate\Database\Eloquent\Model;
use JustBetter\PaginationWithHavings\PaginationWithHavings;
class Cloudsubscriptions extends Model
{
use PaginationWithHavings;
}
И теперь вы можете без проблем использовать исходный код запроса.