我试图添加一个简单的基于闭包的全局查询作用域:
// Order.php
protected static function booted()
{
dd('here');
static::addGlobalScope('test', function ($query) {
$query->where('amount', '>', 50);
});
}
但是,当我执行order::toSQL()
时,只生成以下SQL语句:“select*from”orders“”
,而不生成我在全局查询范围中添加的附加约束。
另外,一直以来最棒的调试工具(dd()
语句)没有被执行,这可能表明引导的方法没有被调用。
那我做错了什么? 我照文件上说的做了。 什么时候调用booted()方法?
boot
方法名仅在Laravel的最后一个版本(7.x
)中更改为booted
,因此请注意这一点,否则它将无法工作。
请始终记住在文档中设置您正在使用的Laravel的版本(在右上角有一个下拉列表,您可以在其中选择版本)
雄辩的查询范围:独立的全局范围
如果您在全局作用域方面有问题希望这会对您有所帮助,您可以在Laravel应用程序中创建一个目录app/scopes,并在该目录中创建一个作用域类,如下所示:
namespace App\Scopes;
use Illuminate\Database\Eloquent\{Scope, Model, Builder};
class ClosedScope implements Scope
{
public function apply(Builder $builder, Model $model)
{
$builder->where('is_closed', '=', false);
}
}
要将其应用于您的虚设票据模型,您可以执行如下操作:
namespace App;
use use App\Scopes\ClosedScope;
use Illuminate\Database\Eloquent\Builder;
class Ticket extends Model
{
protected static function boot()
{
parent::boot();
static::addGlobalScope(new ClosedScope);
}
// [...]
}
雄辩的查询作用域:动态全局作用域
要创建动态全局作用域,您可以直接在示例票证模型的引导方法中写入逻辑,如下所示:
namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;
class Ticket extends Model
{
protected static function boot()
{
parent::boot();
static::addGlobalScope('closed', function (Builder $builder) {
$builder->where('is_closed', '=', false);
});
}
// [...]
}