我试图运行一个Laravel查询,选择一个出现多次的特定字段,我得到了下面的错误。
“SQLSTATE[42S22]:未找到列:1054”“having子句”“中的未知列”“no_of_service”“(SQL:select count(*)作为cloudsubscriptions
内部连接service\u-package
在cloudsubscriptions
上的package\u-id
id
按cloudsubscriptions
分组msisdn
,service\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();
我希望看到多次出现的字段。
我很确定您在代码中使用的是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工厂: