Php 相关模型内的自定义查询eloquent laravel

Php 相关模型内的自定义查询eloquent laravel,php,sql,laravel,orm,eloquent,Php,Sql,Laravel,Orm,Eloquent,我一直在寻找实现以下目标的正确方法 检索模型及其关系的集合 对于给定的关系,调整它以返回自定义查询定义的值 例如,模型用户链接到存档的统计表。然而,这些统计数据需要与其他模型中的各种数据源进行汇总,而这些数据源不容易通过雄辩的ORM进行关联我想你应该寻找范围: 作用域允许您定义通用的约束集,这些约束集可以轻松地在整个应用程序中重复使用。例如,您可能需要经常检索所有被认为是流行的用户。要定义范围,请在雄辩的模型方法前面加上范围 定义范围后,可以在查询模型时调用范围方法。但是,在调用方法时不应包含作

我一直在寻找实现以下目标的正确方法

检索模型及其关系的集合 对于给定的关系,调整它以返回自定义查询定义的值
例如,模型用户链接到存档的统计表。然而,这些统计数据需要与其他模型中的各种数据源进行汇总,而这些数据源不容易通过雄辩的ORM进行关联

我想你应该寻找范围:

作用域允许您定义通用的约束集,这些约束集可以轻松地在整个应用程序中重复使用。例如,您可能需要经常检索所有被认为是流行的用户。要定义范围,请在雄辩的模型方法前面加上范围

定义范围后,可以在查询模型时调用范围方法。但是,在调用方法时不应包含作用域前缀。您甚至可以将调用链接到各种作用域,例如:

$users = App\User::popular()->active()->orderBy('created_at')->get();
有时,您可能希望定义一个接受参数的范围。要开始,只需将其他参数添加到范围中。范围参数应在$query参数之后定义

您可以在文档中找到它


更多信息:

我想您可能需要的是。这将允许您对ORM关系应用自定义查询。但是你提到了一件事,如果我没弄错的话,它可能会对这个简单的方法产生影响

您说过,需要通过对多个模型的值求和得出一些统计数据。如果您的目标是实际执行sumsql函数,或者对于任何聚合,那么有一些警告。Eloquent的急切加载使用独立查询中的语句,而不是联接。因此,如果你在一个关系中的关系上执行聚合,它将对所有内容进行汇总,而不必按照你期望的方式对每个直接父对象的操作进行分组


另一件事是,如果您试图对跨多个表的值执行此求和操作,则on-relation在另一个表上没有直接可见性,您将不得不使用join方法。这将带您进入查询生成器,走出雄辩的世界,从而远离您的模型类可能提供的任何好处。

显示代码,并共享Laravel的版本。您找到解决方案了吗?感谢您的深入回答。我以前研究过作用域,但是我无法使关系与自定义作用域一起工作,即Model::with'relation'->popular->get;唯一从作用域中提取的数据将丢失关系。这可能与我正在使用的查询有关?因此,在查询的其余部分删除select列似乎有问题。看,答案是让我做我需要的,我有另一个问题,但它与上面的问题如何影响关系检索以及范围有关。基本上,您不能在作用域上使用group by,因为您必须使用select“*”作为获得关系的解决方法?
$users = App\User::popular()->active()->orderBy('created_at')->get();