php - 深层关系的雄辩 ORM 顺序
问题描述
楷模:
- 类别(ID、名称)
- 项目(id、名称、category_id、...)
- OrderList (id, user_id, ...)
- OrderListItem(id, item_id, order_list_id, user_sort_order, ...)
我希望对每个 OrderList 的 OrderListItems 进行排序:
- 通过 user_sort_order
- 或按类别名称
我所做的:
$grouped = $request->input('grouped', false) === "true";
$user = User::findOrFail($id);
$order_lists = OrderList::where('kitchen_id', $user->id)
->with(['order_list_items' => function ($q) use ($grouped) {
$q->when($grouped, function ($q) {
return $q->with(['item' => function ($q) {
return $q->with(['category' => function ($q) {
return $q->orderBy('name', 'asc');
}]);
}]);
}, function ($q) {
return $q->orderBy('kitchen_sort_order', 'asc');
})->with('supplier')
->with(['item' => function ($q) {
return $q->with('category');
}]);
}])->get();
按类别名称排序不起作用。我一直在寻找几个小时,但没有找到答案。有可能在 Eloquent ORM 中做这样的事情吗?顺便说一句,Django 能够以非常好的方式做到这一点。
解决方案
您可以将HasManyThrough
关系用作 aBelongsToThrough
并将其与修改后withCount().
的不是最优雅的解决方案相结合,但它有效:
class OrderListItem extends Model {
public function category() {
return $this->hasManyThrough(Category::class, Item::class,
'id', 'id', 'item_id', 'category_id');
}
}
$order_lists = OrderList::where('kitchen_id', $user->id)
->with(['order_list_items' => function ($q) use ($grouped) {
$q->when($grouped, function ($q) {
return $q->withCount(['category as category_name' => function ($q) {
$q->select('categories.name');
}])->orderBy('category_name');
}, function ($q) {
return $q->orderBy('kitchen_sort_order', 'asc');
})->with('supplier')
->with(['item' => function ($q) {
return $q->with('category');
}]);
}])->get();
推荐阅读
- wordpress - WordPress 与 PageLines 冲突
- javascript - 如何同时给出价格和数量的总和
- spring-boot - 在 Intellij 中运行 spring-boot 应用程序时扫描 JPA 实体的外部 jar
- groovy - 调用 jmeter 函数时出错 ${__time(MMddHHmmss,"variable"}
- python - 在 Windows 10 执行之间释放 Tensorflow GPU 2.x 内存 python
- python - spark-nlp:DocumentAssembler 初始化失败,出现“java.lang.NoClassDefFoundError: org/apache/spark/ml/util/MLWritable$class”
- azure - Azure 应用服务中的多层应用的身份验证问题
- reactjs - this.state.projects.map 不是一个函数 - React
- javascript - 删除带有索引js jquery的对象数组
- azure - 在 VSCODE 活动栏上丢失了我的 Azure 图标