相关模型 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 中的自定义查询的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent:如何排序相关模型的结果?

laravel 基础教程 —— Eloquent

急切加载 Laravel Eloquent 相关模型

Laravel count Eloquent belongsToMany 相关模型

Eloquent Laravel 按相关模型排序分页查询

Laravel 数据库操作之Eloquent ORM模型