Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 通过深层关系建立雄辩的ORM秩序_Php_Laravel_Eloquent_Sql Order By - Fatal编程技术网

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);

型号:

  • 类别(id、名称)
  • 项目(id、名称、类别、id等)
  • 订单列表(id、用户id等)
  • OrderListItem(id、项目id、订单列表id、用户排序顺序等)
  • 我希望对每个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();
    

    按类别名称排序不起作用。我搜寻了几个小时,但没有找到答案。有可能在雄辩的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();
    

    您需要使用联接按相关字段排序。这是不可能只用雄辩的,阿法伊。你能给我反馈一下答案吗?