首页 > 解决方案 > Laravel 5.7:Eloquent orderBy 相关模型以及使用 whereHas 条件

问题描述

我有一个OptionGroup具有相关模型的模型,而该模型Option又具有相关模型Attribute

我想获取所有带有选项的选项组,其中选项具有特定的属性 ( product_id) 值,然后default在属性模型中对所有其他值 () 进行排序。

在我的控制器中:

$optionGroups = OptionGroup::with(['options' => function($query) use ($product) {
            $query->whereHas('attributes', function($q) use ($product) {
                $q->where('product_id', $product->id);

                // Ideally here:
                // $q->orderBy('default', 'desc');
            });
        }])
        ->orderBy('sort_order', 'desc')
        ->get();

我尝试了各种雄辩的范围来尝试将其应用orderBy()到模型上,但没有成功。

谢谢。

标签: laraveleloquentrelationship

解决方案


以下查询将为您提供OptionGroups至少Option有一个Attribute属于给定产品(由 确定product_id)的所有。然后,该查询也将仅使用给定的egaer 加载 allOptions和它们。但是由于歧义,无法对子关系进行排序:Attributesproduct_id

$optionGroups = OptionGroup::query()
    ->whereHas('options.attribute' => function ($query) use ($product) {
        $query->where('product_id', $product->id);
    })
    ->with(['options.attribute' => function ($query) use ($product) {
        $query->where('product_id', $product->id);
    }])
    ->get();

推荐阅读