当前位置: 首页 > 知识库问答 >
问题:

Laravel-未找到列:1054 Laravel查询中的未知列

单于善
2023-03-14

我试图运行一个Laravel查询,选择一个出现多次的特定字段,我得到了下面的错误。

“SQLSTATE[42S22]:未找到列:1054”“having子句”“中的未知列”“no_of_service”“(SQL:select count(*)作为cloudsubscriptions内部连接service\u-packagecloudsubscriptions上的package\u-ididcloudsubscriptions分组msisdnservice\u-package标题具有无服务

$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个答案

湛联
2023-03-14

我很确定您在代码中使用的是paginate(),而不是您发布的get()。当Laravel生成分页所需的数据时,它会用以下内容覆盖语句的SELECT部分:

SELECT count(*) as aggregate

这用于获取总条目数。从错误消息的SQL部分可以看出这一点:

SQL:选择计数(*)作为cloudsubscriptions.package_id=service_package.id组内连接service_packagecloudsubscriptions.msisdn,service_package.titleno_of_service

这当然会覆盖no\u of_服务别名定义,当分页器完成总计数时,在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分页,这是一个更大的好处。

重要提示!如果值来自用户输入,请确保将绑定与havingRaw和其他原始方法一起使用。

由于您使用Eloquent作为查询的起点,您可以使用Roy Duineveld制作的这个伟大的包,它修复了分页器中存在的问题,并允许您在HAVING语句中使用别名。您可以通过简单地在模型中包含一个特性来使用它:

use Illuminate\Database\Eloquent\Model;
use JustBetter\PaginationWithHavings\PaginationWithHavings;

class Cloudsubscriptions extends Model
{
    use PaginationWithHavings;
}

现在你可以使用你的原始查询代码,没有任何问题。

 类似资料:
  • 我使用的框架Laravel。 我有两个表(用户和成员)。当我想登录时,我会收到错误消息: SQLSTATE[42S22]:找不到列: 1054未知的列'user_email'in'where子句'(SQL:选择*fromwhere=?限制1)(绑定:数组(0= 表用户 表成员 迁移用户 移民成员 模型用户 模范会员 成员模型使用:使用照明\Auth\UserInterface; 控制器 auth.

  • 我已经定义了不使用时间戳,但仍然使用laravel强制使用时间戳...我使用laravel 5.6。 例如,当我访问页面时-http://mypage/api/videos/21/comments 我得到一个错误-“SQLSTATE[42S22]:未找到列:在“order子句”(SQL:select*fromwhere视频id=▶" app/Providers/VideoComment.php a

  • 问题内容: 我正在使用Laravel框架。 我有2个表(用户和成员)。当我想登录时,收到错误消息: SQLSTATE [42S22]:找不到列:1054’where子句’中的未知列’user_email’(SQL:select * from where =?limit 1)(绑定:数组(0 =>'test@hotmail.com‘,)) 表用户 表成员 迁移用户 移民会员 模型使用者 模范会员 成

  • 我想在laravel系统中编辑我的数据,该系统有一个客户id作为增量密钥。但错误是, Illumb\Database\QueryException(42S22)SQLSTATE[42S22]:未找到列:“where子句”中的1054未知列“customers.id”(SQL:select*fromwhereid=4限制1) 以前的例外 SQLSTATE[42S22]:未找到列:“where子句”(

  • 我正在制作一个我想登录和注册的应用程序,并且能够将csv文件导入数据库,注册和登录工作正常,但是当我想导入csv时,我遇到了这个问题: 错误luminate\Database\QueryException SQLSTATE[42S22]:未找到列:1054“where子句”中的未知列“classe”(SQL:select*fromwhere(=7和=7598)限制1)科目表 账户控制员

  • 我试图在“Categoria”表和“Noticia”表之间创建一个多对多关系,然后使用工厂生成数据,但我得到了那个错误。我已经创建了一个透视表,但我不知道出了什么问题,我对这个很陌生。。。。 Noticia模型: 名称空间应用程序; 使用Illumb\Database\Elount\Model; 类Noticia扩展模型{ } 类别模型: 支点迁移: 诺西西亚移民 类别迁移: Noticia工厂: