Php 拉威尔:有没有更聪明的方法只返回用户记录而不是在每个查询中过滤它们
在我的Laravel应用程序中,我有以下型号:Php 拉威尔:有没有更聪明的方法只返回用户记录而不是在每个查询中过滤它们,php,laravel,eloquent,Php,Laravel,Eloquent,在我的Laravel应用程序中,我有以下型号: 用户、业务、配置文件、订阅。 一个用户将有一个业务,一个业务将有一个配置文件和多个订阅 在我的Subscription controller中,许多用于下拉已登录用户订阅的方法要求我添加以下内容: Subscription::where('business_id', '=', Auth::user()->business->id)->active()->get(); 在一个查询中,这可能不是问题,但我有许多方法可以提取业务
用户、业务、配置文件、订阅。
一个用户将有一个业务,一个业务将有一个配置文件和多个订阅 在我的Subscription controller中,许多用于下拉已登录用户订阅的方法要求我添加以下内容:
Subscription::where('business_id', '=', Auth::user()->business->id)->active()->get();
在一个查询中,这可能不是问题,但我有许多方法可以提取业务订阅记录,我想知道是否有一种更智能的方法可以只获取业务记录,同时还可以为查询添加其他作用域。假设订阅和业务之间存在Laravel关系,您可以这样重写此查询:
$subs = Auth::user()->business->subscriptions()->active()->get();
->subscriptions()
部分将返回一个查询,您可以在其上链接其他作用域。如果您的关系设置正确,则可以执行以下操作之一
$subscriptions = auth()->user()->business()->subscriptions()->active()->get();
$subscriptions = Subscription::whereHas('business', function ($query) {
$query->where('user_id', auth()->id());
})->active()->get();
既然用户只有一个业务,为什么要将订阅与业务id关联?这是为了允许将来将一个业务分配给多个用户是的,我理解这一点。尽管如此,这取决于您的用例和工作流的其余部分。尝试使用关系,而不是进行此类查询。另一个可能的暗示。如果您希望将来有更多的用户属于某个企业。围绕“业务”启动/创建逻辑。例如,“一个企业有一个/多个用户”、“用户有一个订阅”、“用户属于一个企业”您应该使用
business()
而不是business
,因为您不需要这里的业务对象。我很确定这不会起作用,因为business()
会返回查询对象,而不是模型。查询对象没有关系,模型有关系。事实上,您需要知道业务的id
,才能获得相关订阅。另外,通过使用->business
,如果您碰巧在更早的地方加载了business
,则无需再次查询它。