【问题标题】:Why does not work SQL query Laravel?为什么 SQL 查询 Laravel 不起作用?
【发布时间】:2017-08-02 10:12:18
【问题描述】:

我有以下 SQL 查询:

return User::where("users.id", $id)
            ->select(array('rating.rate', User::raw('count(offers.id) AS ofrs, count(announcements.id) as appts')))
            ->join('announcements', 'users.id', '=', 'announcements.user_id')
            ->join('offers', 'users.id', '=', 'offers.user_id')
            ->join('rating', 'users.id', '=', 'rating.user_id')
            ->group_by('ofrs')
            ->get();

它给了我一个错误:

Builder.php 第 2508 行中的 BadMethodCallException:调用未定义 方法 Illuminate\Database\Query\Builder::group_by()

为什么不按组工作?

我也尝试过:

  return User::where("users.id", $id)
            ->selectRaw('rating.rate, count(offers.id) AS ofrs, count(announcements.id) as appts')
            ->groupBy('appts')
            ->groupBy('ofrs')
            ->join('announcements', 'users.id', '=', 'announcements.user_id')
            ->join('offers', 'users.id', '=', 'offers.user_id')
            ->join('rating', 'users.id', '=', 'rating.user_id')
            ->get();

结果:

SQLSTATE[42000]: Syntax error or access violation: 1056 Can't group on 'appts'

我已经直接用SQL写了SQL查询:

select rating.rate, COUNT(offers.id) AS ofrs, COUNT(announcements.id) as appts from `users` left join `announcements` on `users`.`id` = `announcements`.`user_id` left join `offers` on `users`.`id` = `offers`.`user_id` left join `rating` on `users`.`id` = `rating`.`user_id` where `users`.`id` = 1

它有效,按型号不:

return User::where("users.id", $id)
            ->selectRaw('rating.rate, COUNT(offers.id) AS ofrs, COUNT(announcements.id) as appts')
            ->leftJoin('announcements', 'users.id', '=', 'announcements.user_id')
            ->leftJoin('offers', 'users.id', '=', 'offers.user_id')
            ->leftJoin('rating', 'users.id', '=', 'rating.user_id')
            ->get();

这项工作:

return User::where("users.id", $id)
            ->selectRaw('rating.rate, COUNT(offers.id) AS ofrs, COUNT(announcements.id) AS appts')
            ->leftJoin('announcements', 'users.id', '=', 'announcements.user_id')
            ->leftJoin('offers', 'users.id', '=', 'offers.user_id')
            ->leftJoin('rating', 'users.id', '=', 'rating.user_id')
            ->groupBy('rating.rate')
            ->get();

【问题讨论】:

  • groupBy('ofrs') 不是group_by
  • 我试过groupBy('ofrs')
  • 您是否在您的用户模型中为announcementsoffersrating 设置了关系?
  • 相对用户?
  • 但是 SQL 查询中的问题,而不是模型中的问题

标签: laravel laravel-5.4


【解决方案1】:

您为 group by 调用的函数名称不正确。试试:

->groupBy('ofrs')

请参阅here 了解更多信息。

【讨论】:

  • 对您的问题的编辑是一个完全不同的问题。在这种情况下,您似乎正在尝试对计数的聚合进行分组。你到底想在这里实现什么?这与您原来的问题完全不同。
  • 我需要将表用户与其他表连接起来,并为当前用户计算相关表中的行数
  • 所以您正在有效地尝试获取每个用户的优惠和公告的数量?
  • 我已经直接在 SQL 中编写了这个查询:select rating.rate, COUNT(offers.id) AS ofrs, COUNT(announcements.id) as appts from users` left join announcements on users.id = announcements.user_id left join offers on @ 987654330@.id = offers.user_id left join rating on users.id = rating.user_id users.@9875,但是它有效,但是在 Laravel 中没有
  • 请看问题
【解决方案2】:

您需要了解 SQL 的工作原理。您不能按计数别名进行分组。您正在寻找的可能是三个查询或三个关系。

您应该为公告创建用户关系,为优惠创建第二个关系,为评级创建第三个关系。

User::find($id)->announcements->count()User::find($id)->offers->count()User::find($id)->ratings->count() 更重要

或者您可以使用您的 Fluent 方式,例如:

return User::find($id) ->leftJoin('announcements', 'users.id', '=', 'announcements.user_id') ->count();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    • 2012-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多