无需控制器,如何在路由中筛选含有效价格的ProductResource集合?
解决方案
你的写法存在问题,Product::all()会直接执行查询并返回Eloquent集合,集合实例无法调用prices()这类关联查询方法,得用查询构建器来实现过滤逻辑。
直接在路由闭包里就能完成需求,用whereHas方法筛选出存在有效价格的产品,同时调用isActive作用域:
Route::get('/product', function (Request $request) { return new ProductCollection( Product::whereHas('prices', function ($query) { $query->isActive(); })->get() ); });
如果需要同时加载产品关联的有效价格(避免N+1查询问题),可以补充with方法:
Route::get('/product', function (Request $request) { return new ProductCollection( Product::whereHas('prices', function ($query) { $query->isActive(); }) ->with(['prices' => function ($query) { $query->isActive(); }]) ->get() ); });
这样就能得到仅包含带有有效价格的产品集合,完全不需要额外创建控制器。
内容的提问来源于stack exchange,提问作者St. Jan
相关产品推荐
相关产品推荐

