自定义查询内部相关模型雄辩的laravel

时间:2018-04-06 13:01:23

标签: php sql laravel orm eloquent

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

  • 检索模型及其关系的集合
  • 对于给定的关系,请将其调整为返回自定义查询定义的值

因此,例如,模型用户链接到存档的统计信息表。然而,这些统计数据需要与其他模型中的各种数据来源相加,这些数据通过雄辩的ORM不易相关ORM

2 个答案:

答案 0 :(得分:1)

我猜你在寻找SCOPES:

范围允许您定义可在整个应用程序中轻松重复使用的常见约束集。例如,您可能需要经常检索所有被认为是#34;流行的用户"。要定义范围,请使用Eloquentscope模型方法添加前缀。

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();

ometimes你可能希望定义一个接受参数的范围。要开始使用,只需将其他参数添加到示波器即可。范围参数应在$ query参数之后定义。

您可以在文档中找到它。

更多:https://laravel.com/docs/5.6/eloquent#local-scopes

答案 1 :(得分:0)

我认为您可能正在寻找的是eager-load-constraints。这将允许您将自定义查询应用于ORM关系。但你在那里提到的一些事情,如果我理解你的话,可能会用一种简单的方法来解决问题。

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

另一件事是,如果您尝试对跨越多个表的值执行此SUM操作,则关系对另一个表没有直接可见性,并且您将不得不使用{{ 1}}方法。这将带您进入Query-Builder并进入Eloquent世界,因此远离模型类可能提供的任何好处。