首页 > 解决方案 > 深层关系的雄辩 ORM 顺序

问题描述

楷模:

  1. 类别(ID、名称)
  2. 项目(id、名称、category_id、...)
  3. OrderList (id, user_id, ...)
  4. OrderListItem(id, item_id, order_list_id, user_sort_order, ...)

我希望对每个 OrderList 的 OrderListItems 进行排序:

我所做的:

$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 能够以非常好的方式做到这一点。

标签: phplaraveleloquentsql-order-by

解决方案


您可以将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();

推荐阅读