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

时间:2019-06-13 14:25:17

标签: laravel eloquent

我试图运行一个Laravel查询,该查询选择了一个不止一次出现的特定字段,并且出现以下错误。

  

“ SQLSTATE [42S22]:找不到列:1054'具有子句'中的未知列'no_of_service'(SQL:从this.$refs.myhref.href = 'tel:' + phone 内部联接cloudsubscriptions的{​​{ 1}}。service_package = cloudsubscriptionspackage_idservice_packageidcloudsubscriptionsmsisdn分组,其中{{1 }}> 1)

service_package

我希望看到出现多次的字段。

1 个答案:

答案 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;
}

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