Php 通过深层关系建立雄辩的ORM秩序
型号:Php 通过深层关系建立雄辩的ORM秩序,php,laravel,eloquent,sql-order-by,Php,Laravel,Eloquent,Sql Order By,型号: 类别(id、名称) 项目(id、名称、类别、id等) 订单列表(id、用户id等) OrderListItem(id、项目id、订单列表id、用户排序顺序等) 我希望对每个OrderList的OrderListItems进行排序: 按用户\排序\顺序 或者按类别名称 我所做的: $grouped = $request->input('grouped', false) === "true"; $user = User::findOrFail($id);
- 按用户\排序\顺序
- 或者按类别名称
$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();
按类别名称排序不起作用。我搜寻了几个小时,但没有找到答案。有可能在雄辩的ORM中做这样的事情吗?顺便说一句,Django能够以一种非常好的方式来实现这一点。您可以使用
HasManyThrough
关系作为中的,并将其与修改后的with count()相结合。
不是最优雅的解决方案,但它可以:
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();
您需要使用联接按相关字段排序。这是不可能只用雄辩的,阿法伊。你能给我反馈一下答案吗?