我一直在寻找实现以下目标的正确方法。
因此,例如,模型用户链接到存档的统计信息表。然而,这些统计数据需要与其他模型中的各种数据来源相加,这些数据通过雄辩的ORM不易相关ORM
答案 0 :(得分:1)
我猜你在寻找SCOPES:
范围允许您定义可在整个应用程序中轻松重复使用的常见约束集。例如,您可能需要经常检索所有被认为是#34;流行的用户"。要定义范围,请使用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();
ometimes你可能希望定义一个接受参数的范围。要开始使用,只需将其他参数添加到示波器即可。范围参数应在$ query参数之后定义。
您可以在文档中找到它。
答案 1 :(得分:0)
我认为您可能正在寻找的是eager-load-constraints。这将允许您将自定义查询应用于ORM关系。但你在那里提到的一些事情,如果我理解你的话,可能会用一种简单的方法来解决问题。
您说有些统计数据需要通过汇总多个模型的值来得出。如果您的目标是实际执行SUM
SQL函数,或者就此而言,任何聚合,都有一些警告。 Eloquent的急切加载在独立查询中使用IN
语句,而不是JOINs
。因此,如果您在关系关系上执行聚合,那么它将总结所有内容,而不一定按照您期望的方式按直接父方式对这些操作进行分组。
另一件事是,如果您尝试对跨越多个表的值执行此SUM
操作,则关系对另一个表没有直接可见性,并且您将不得不使用{{ 1}}方法。这将带您进入Query-Builder并进入Eloquent世界,因此远离模型类可能提供的任何好处。