Laravel - столбец не найден: 1054 Неизвестный столбец в запросе Laravel - PullRequest
1 голос
/ 13 июня 2019

Я попытался выполнить запрос Laravel, который выбирает определенное поле, которое появляется более одного раза, и получил ошибку ниже.

"SQLSTATE [42S22]: Столбец не найден: 1054 Неизвестный столбец«no_of_service» в «имеющем предложении» (SQL: выберите количество (*) в качестве агрегата из cloudsubscriptions внутреннего объединения service_package на cloudsubscriptions. package_id = service_package. id сгруппировать по cloudsubscriptions. msisdn, service_package. title с no_of_service> 1)

$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")
    ->having('no_of_service', '>', 1)
    ->get();

Я ожидаю увидеть поля, которые появляются более одного раза.

1 Ответ

1 голос
/ 13 июня 2019

Я уверен, что вы используете 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;
}

И теперь вы можете без проблем использовать исходный код запроса.

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