是否可以将 laravel 上的 Eager 加载中的嵌套 Where 与父项分组?

Is it possible to group nested Where inside a Eager loading on laravel with the parent?

我一直在寻找一种方法来从 Laravel 中的预加载查询内部对嵌套 wheres 进行分组,假设我有 3 个模型,一个 Order,一个 Review,以及一个Product。为简单起见,Order 有一个 Review 和一个 Product

我想获取所有 ordersreviews 以及缺少 buyer_rateseller_rateproduct 数据(我可以分组它们在代码中,没问题)。但我还想检查登录的用户是下订单的用户(Order class 中的user_id)还是产品的卖家(user_id里面Product class).

问题是我无法找到一种方法来告诉 Eloquent 我想要这个逻辑:

('reviews'.'buyer_rate' != null OR 'reviews'.'seller_rate' != null) 
AND ('orders'.'user_id' == Auth::user()->id OR 'orders'.'producto'.'user_id' == Auth::user()->id)

这是我的代码:(但是我无法创建第二个条件组) 我的条件失败,因为它不会计算两组之间的 AND 逻辑。

$reviews = App\Order::with([
    'review' => function ($q) {
        $q->Where(function($query) { // Group Where buyer or seller's rate is missing.
            $query->Where('buyer_rate', '!=', null);
            $query->orWhere('seller_rate', '!=', null);
        });
    },
    'producto' => function ($q) {
        $q->select('id', 'user_id', 'nombre', 'precio', 'descripcion')
        ->orWhere('user_id', Auth::user()->id);
    },
])
->orWhere('user_id', Auth::user()->id)
->get();

我认为您需要使用 whereHas(这又会使用 exists 查询)。如果您只使用 with,无论如何您仍然会得到每个 Order。您只过滤急切加载的相关 ReviewProduct

使用 whereHaswhereExists,您首先过滤 Order 模型,然后加载关系。

App\Order::where(function ($query) {
    $query->where('user_id', auth()->id())->orWhereHas('producto', function ($producto) {
        $producto->where('user_id', auth()->id());
    });
})
->whereHas('review', function ($review) {
    $review->whereNotNull('buyer_rate')->orWhereNotNull('seller_rate');
})
->with([
    'review',
    'producto' => function ($producto) {
        $producto->select('id', 'user_id', 'nombre', 'precio', 'descripcion');
    },
])
->get();

auth()->id()auth()->user()->idAuth::user()->id

相同