我试图运行一个Laravel查询,该查询选择了一个不止一次出现的特定字段,并且出现以下错误。
“ SQLSTATE [42S22]:找不到列:1054'具有子句'中的未知列'no_of_service'(SQL:从
this.$refs.myhref.href = 'tel:' + phone
内部联接cloudsubscriptions
的{{ 1}}。service_package
=cloudsubscriptions
。package_id
由service_package
。id
,cloudsubscriptions
。msisdn
分组,其中{{1 }}> 1)
service_package
我希望看到出现多次的字段。
答案 0 :(得分:1)
我很确定您在代码中使用的是paginate()
,而不是您发布的get()
。当Laravel生成用于分页的必要数据时,它将使用以下内容覆盖语句的SELECT
部分:
SELECT count(*) as aggregate
这用于获取总计条目计数。从错误消息的SQL部分中可以很明显地看出这一点:
SQL:从云预订的内部订阅中将count(*)选择为总计 。
这当然会覆盖您的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
和其他raw methods绑定。
由于您使用Eloquent作为查询的起点,因此可以利用this great package制作的Roy Duineveld,它可以解决分页器中存在的问题,并允许您使用别名在您的HAVING
语句中。您只需在模型中加入特征即可使用它:
use Illuminate\Database\Eloquent\Model;
use JustBetter\PaginationWithHavings\PaginationWithHavings;
class Cloudsubscriptions extends Model
{
use PaginationWithHavings;
}
现在您可以使用原始查询代码了,没有任何问题。