Laravel orderBy 与分页和关系
Laravel orderBy with paginate and relations
我运行进入以下问题:
我写了一个生成 eloquent 查询的动态特征。到目前为止这有效。但是由于数据集可能非常大(行+可能的关系),我想对其进行分页。只要我不尝试对其进行排序,这也不是问题。在主模型上排序也很容易,但是,当我想根据关系的 属性 排序时(假设关系是成员,我想根据名称排序)我 运行进入问题。
我天真地忽略了关系的预加载,当然这是行不通的。
我也想尽可能避免连接,因为我真的只需要数据集和我的关系。
return $model->sortBy('member.name')->offset(0)->take(50)->get();
显然不起作用,因为我需要在 sortBy 之前使用 get()。但是将其重写为
return $model->get()->sortBy('employee.PRSVORNAME')->offset(0)->take(50)->get();
当我取回一个无法分页的集合时不起作用(请注意,我没有在此处包含分页(),因为这基本上导致与 offset()->take()->get 相同的问题();
有没有不用连接就可以做到这一点的方法?
在这种情况下,我想根据关系的列进行排序,我所做的是调用关系模型对其进行排序:
假设您的查询是:
$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();
之后您可以添加分页或任何您喜欢的内容,因为您的 collection 已经排在 ->get()
之后
对于上面的示例,我假设两个表之间的外键是 id
列。如果它是另一列,您可以在 whereColumn
中匹配它
我运行进入以下问题: 我写了一个生成 eloquent 查询的动态特征。到目前为止这有效。但是由于数据集可能非常大(行+可能的关系),我想对其进行分页。只要我不尝试对其进行排序,这也不是问题。在主模型上排序也很容易,但是,当我想根据关系的 属性 排序时(假设关系是成员,我想根据名称排序)我 运行进入问题。
我天真地忽略了关系的预加载,当然这是行不通的。 我也想尽可能避免连接,因为我真的只需要数据集和我的关系。
return $model->sortBy('member.name')->offset(0)->take(50)->get();
显然不起作用,因为我需要在 sortBy 之前使用 get()。但是将其重写为
return $model->get()->sortBy('employee.PRSVORNAME')->offset(0)->take(50)->get();
当我取回一个无法分页的集合时不起作用(请注意,我没有在此处包含分页(),因为这基本上导致与 offset()->take()->get 相同的问题();
有没有不用连接就可以做到这一点的方法?
在这种情况下,我想根据关系的列进行排序,我所做的是调用关系模型对其进行排序:
假设您的查询是:
$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();
之后您可以添加分页或任何您喜欢的内容,因为您的 collection 已经排在 ->get()
对于上面的示例,我假设两个表之间的外键是 id
列。如果它是另一列,您可以在 whereColumn