代码之家  ›  专栏  ›  技术社区  ›  AnchovyLegend

Laravel查询生成器orderBy不排序

  •  0
  • AnchovyLegend  · 技术社区  · 8 年前

    我正在做一个项目,使用 Laravel query builder 我在订购数据时遇到了麻烦。首先,我需要按名称排序,这是“users”表中的联接列。

    我的代码:

            $Records = Tickets::with('User', 'Session', 'Session.Course');
            $Records = $Records->orderBy('first_name', 'desc'); //generates an error as no first_name column exists in the current query, although the first name is rendered in the view!
            $Records = $Records->get();
    

    我不确定查询生成器是如何建立关联来获取用户名的,因为调用toSql()来获取原始查询在任何时候都不会生成连接查询。

    正确的方法是什么?

    这真的很棘手,我很感激你的帮助。

    3 回复  |  直到 8 年前
        1
  •  2
  •   AnchovyLegend    8 年前

    with() 不向查询添加联接,而是为每个关系执行单独的查询。

    您可以添加 JOIN 你自己:

    $Records = Tickets::select('tickets.*')
        ->join('users', 'users.id', '=', 'tickets.user_id')
        ->orderBy('users.first_name', 'desc')
        ->get();
    

    在Laravel 5.2.32中,可以使用修改后的 withCount() :

    $Records = Tickets::withCount(['User as first_name' => function($query) {
        $query->select('first_name');
    }])->orderBy('first_name', 'desc')->get();
    

    这将选择 users.first_name 使用子查询:

    select `tickets`.*,
      (select `first_name`
       from `users`
       where `tickets`.`user_id` = `users`.`id`) as `first_name`
    from `tickets`
    order by `first_name` desc
    
        2
  •  1
  •   user10186369user10186369    8 年前

    你应该试试这个:

    $Records = Tickets::select('tickets.*')
        ->join('users', 'tickets.user_id', '=', 'users.id')
        ->orderBy('users.first_name', 'desc')
        ->get();
    
        3
  •  -1
  •   AmirhosseinDZ    8 年前

    你没提到哪张桌子有 first_name 列,因此必须定义表名。 试试这个:

    $Records->orderBy('users.first_name', 'desc');