是否可以将 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
。
我想获取所有 orders
和 reviews
以及缺少 buyer_rate
或 seller_rate
的 product
数据(我可以分组它们在代码中,没问题)。但我还想检查登录的用户是下订单的用户(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
。您只过滤急切加载的相关 Review
或 Product
。
使用 whereHas
或 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
相同
我一直在寻找一种方法来从 Laravel 中的预加载查询内部对嵌套 wheres 进行分组,假设我有 3 个模型,一个 Order
,一个 Review
,以及一个Product
。为简单起见,Order
有一个 Review
和一个 Product
。
我想获取所有 orders
和 reviews
以及缺少 buyer_rate
或 seller_rate
的 product
数据(我可以分组它们在代码中,没问题)。但我还想检查登录的用户是下订单的用户(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
。您只过滤急切加载的相关 Review
或 Product
。
使用 whereHas
或 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