首页 > 解决方案 > $query $builder 变量?

问题描述

你好,我对 laravel 有点陌生,我正在尝试学习作用域,但我在函数参数中找不到任何关于 $query 和 $builder 变量的信息。有人可以解释为什么你需要使用这些变量,因为你调用范围方法你不传递任何参数。

标签: laravellaravel-5

解决方案


$query/$builder变量允许您以与使用模型相同的方式将约束添加到查询中,Eloquent或者DB

$query->where('admin', true);

范围基本上允许您采用多个约束(where 子句、连接、拥有等)并使其实现,因此您只需链接一个方法,而不是在多个位置添加相同的逻辑。


例子

假设您有一个 products 表,并且您想检查该项目是否active存在stock。如果你不使用范围,你会得到类似的东西:

Product::where('active', true)->where('quantity', '>=', 1)->get();

然而,您可以在模型中创建一个范围available

public function scopeAvailable($query) 
{
    $query->where('active', true)->where('quantity', '>=', 1);
}

然后你可以简单地做:

Product::available()->get();

范围也可以带参数

假设我们有一个 offer 表,其中有一个available_fromavailable_to日期,并且您想要获取特定日期可用的所有行:

Offer::where('available_from', '<=', $date)
    ->where('available_to', '>=', $date)
    ->get();

或者我们可以做一个availableOn范围

public function scopeAvailableOn($query) 
{
    $query->where('available_from', '<=', $date)->where('available_to', '>=', $date);
}

这将允许您执行以下操作:

Offer::availableOn($date)->get();

推荐阅读