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

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


我想获取所有的orders数据和reviews丢失或丢失的数据(我可以在代码中对它们进行分组,没有问题)。但我还想检查登录的用户是下订单的人(在课堂上)还是产品的卖家(在课堂上)。productbuyer_rateseller_rateuser_idOrderuser_idProduct


问题是我找不到方法告诉 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();


ITMISS
浏览 126回答 1
1回答

莫回无

我认为您需要使用whereHas(反过来使用exists查询)。如果你只使用 with,你仍然会得到每一个Order。您只过滤哪些相关Review或Product急切加载。使用whereHasor whereExists,您首先过滤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()->id与或相同Auth::user()->id
打开App,查看更多内容
随时随地看视频慕课网APP