通过深厚的关系雄辩的ORM顺序

时间:2018-08-05 09:55:12

标签: php laravel eloquent sql-order-by

型号:

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

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

  • 通过user_sort_order
  • 或按类别名称

我做什么:

preferences = {'bacon':5,'ham':-2,'salami':1}

#...

for i, sandwich in enumerate(sandwiches):
    for filling in sandwich:
        sandwichscores[i] += preferences.get(filling, 0)

无法按类别名称排序。我已经搜索了几个小时,但没有找到答案。是否可以在雄辩的ORM中执行类似的操作?顺便说一句,Django能够以一种非常不错的方式做到这一点。

1 个答案:

答案 0 :(得分:0)

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