相关模型 eloquent laravel 中的自定义查询
Posted
技术标签:
【中文标题】相关模型 eloquent laravel 中的自定义查询【英文标题】:Custom query inside related model eloquent laravel 【发布时间】:2018-09-16 12:28:46 【问题描述】:我一直在寻找实现以下目标的正确方法。
检索模型及其关系的集合 对于给定的关系,调整它以返回自定义查询定义的值例如,模型用户链接到存档统计表。然而,这些统计数据需要与其他模型中的各种数据源相加,这些数据不容易通过 eloquents ORM 关联起来
【问题讨论】:
显示代码,分享 Laravel 版本。 你找到解决办法了吗? 【参考方案1】:我猜你在寻找 SCOPES:
范围允许您定义可以在整个应用程序中轻松重复使用的通用约束集。例如,您可能需要经常检索所有被认为“受欢迎”的用户。要定义范围,请在 Eloquent
模型方法前面加上 scope
。
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model
/**
* Scope a query to only include popular users.
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopePopular($query)
return $query->where('votes', '>', 100);
/**
* Scope a query to only include active users.
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeActive($query)
return $query->where('active', 1);
一旦定义了作用域,就可以在查询模型时调用作用域方法。但是,在调用方法时不应包含范围前缀。您甚至可以将调用链接到各种范围,例如:
$users = App\User::popular()->active()->orderBy('created_at')->get();
有时您可能希望定义一个接受参数的范围。要开始,只需将您的附加参数添加到您的范围。范围参数应在 $query 参数之后定义。
您可以在文档中找到它。
更多:https://laravel.com/docs/5.6/eloquent#local-scopes
【讨论】:
感谢您提供如此深入的回答。我以前看过范围,但是我无法让关系与自定义范围一起工作,即Model::with('relation')->popular()->get();
唯一拉回的数据来自范围并且关系丢失了。这可能与我正在使用的查询有关?
因此,对于查询的其余部分,选择列被删除似乎是一个问题。请参阅***.com/questions/29510601/… 但是答案是让我做我需要的事情,我遇到了另一个问题,但这与上述问题如何影响关系检索以及范围有关。基本上,您不能在范围内使用 group by,因为您必须使用 select('*') 作为解决方法来获取关系?【参考方案2】:
我认为您可能正在寻找的是eager-load-constraints。这将允许您将自定义查询应用于 ORM 关系。但是您在其中提到了一些内容,如果我理解正确的话,可能会影响这种原本简单的方法。
您说需要通过汇总多个模型的值来得出统计数据。如果您的目标是实际执行SUM
SQL 函数,或者就此而言,任何聚合,都有一些警告。 Eloquent 的急切加载在独立查询中使用 IN
语句,而不是 JOINs
。因此,如果您在关系中执行聚合,它将汇总所有内容,而不必按照您期望的方式将这些操作分组到每个直接父级。 p>
另一件事是,如果您尝试对跨越多个表的值执行此 SUM
操作,则关系对另一个表没有直接可见性,您将不得不使用 join()
方法.这将带你进入 Query-Builder 并离开 Eloquent 世界,因此远离你的 Model 类可能提供的任何好处。
【讨论】:
以上是关于相关模型 eloquent laravel 中的自定义查询的主要内容,如果未能解决你的问题,请参考以下文章