【问题标题】:Eloquent ORM order by deep relation深层关系的雄辩 ORM 顺序
【发布时间】:2018-08-05 09:55:12
【问题描述】:

型号:

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

【问题讨论】:

  • 您需要使用join来按相关字段排序。仅使用 Eloquent 是不可能的,afaik。

标签: php laravel eloquent sql-order-by


【解决方案1】:

您可以将HasManyThrough 关系用作BelongsToThrough 并将其与修改后的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();

【讨论】:

  • 您能否就答案提供反馈?
猜你喜欢
  • 2014-06-22
  • 1970-01-01
  • 2018-09-16
  • 2018-08-06
  • 1970-01-01
  • 1970-01-01
  • 2018-11-07
  • 1970-01-01
  • 2016-02-26
相关资源
最近更新 更多