提问者:小点点

雄辩模型的booted()方法何时被调用?


我试图添加一个简单的基于闭包的全局查询作用域:

// 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()方法?


共2个答案

匿名用户

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

    // [...]

}