【问题标题】:Laravel orderBy with paginate and relationsLaravel orderBy 与分页和关系
【发布时间】:2022-01-16 01:13:53
【问题描述】:

我遇到了以下问题: 我写了一个动态特征,生成了一个雄辩的查询。到目前为止,这有效。但是由于数据集可能非常大(行+可能的关系),我想对其进行分页。只要我不尝试对其进行排序,这也不是问题。对主模型进行排序也很容易,但是,当我想根据关系的属性进行排序(假设关系是成员并且我想根据名称进行排序)时,我遇到了问题。

我很天真地忽略了关系的急切加载,当然这不起作用。 我还想尽可能避免连接,因为我真的只需要数据集和我的关系。

return $model->sortBy('member.name')->offset(0)->take(50)->get();

显然不起作用,因为我需要在 sortBy 之前 get()。但是将其重写为

return $model->get()->sortBy('employee.PRSVORNAME')->offset(0)->take(50)->get();

当我得到一个无法分页的集合时不起作用(请注意,我没有在此处包含 pagination(),因为这基本上导致与 offset()->take()->get() 相同的问题;

有没有办法在不使用连接的情况下做到这一点?

【问题讨论】:

    标签: laravel eloquent eloquent-relationship


    【解决方案1】:

    在这种情况下,我想根据关系的列进行排序,我所做的是调用关系模型对其进行排序:

    假设您的查询是:

    $myQuery = $model->with('employee')->where('this_column','=','that_column');
    

    接下来是排序部分。例如,假设您的关系模型称为Employee

        $myQuery->orderBy(
            Employee::select('id')
                ->whereColumn('employee_id', 'employee.id')
                ->orderBy('PRSVORNAME', 'asc')
                ->limit(1),
            'asc'
        );
    
    return $myQuery->get();
    

    之后,您可以添加分页或任何您喜欢的内容,因为您的收藏已在 ->get() 之后排序

    对于上面的例子,我假设两个表之间的外键是id 列。如果它是另一列,您可以在 whereColumn 中匹配它

    【讨论】:

      猜你喜欢
      • 2015-11-21
      • 2021-07-01
      • 2017-03-25
      • 2021-10-13
      • 1970-01-01
      • 2019-05-14
      • 2013-08-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多