Laravel:如何在创建具有全局范围的模型实例后

时间:2018-09-24 11:53:35

标签: laravel eloquent

我很难获得具有全局范围的模型实例。

通常,如果您写:

$offer = Offer::createNew();

使用

public static function createNew()
{
    return static::create([
         'user_id' => auth()->id(), 
         'reviewed' => false
    ]);             
}

您将获得模型实例。但是现在我添加了一个全局范围,无法使其正常工作。

您所期望的模型几乎是“空的”,因为在我的情况下,我只希望获得经过审核的商品。但是,如果我添加:

public static function createNew()
{
    return static:::withoutGlobalScopes()->create([
         'user_id' => auth()->id(), 
         'reviewed' => false
    ]);             
}

我从一个仅包含以下属性的有限模型中得到了一个结果:

#attributes: array:5 [
    "user_id" => 1
    "reviewed" => false
    "updated_at" => "2018-09-24 11:48:27"
    "created_at" => "2018-09-24 11:48:27"
    "id" => 2
  ]

但是我的模型显然具有更多的属性。如果我添加get(),我只会得到

Illuminate\Database\Eloquent\Collection {#1635
  #items: []
}

那么在具有全局作用域时,如何通过create创建模型?

修改

我的第一个解决方法如下:

public static function createNew()
{

    $model = static::create([
                'user_id' => auth()->id(), 
                'reviewed' => false
            ]);

    return static::withoutGlobalScopes()->find($model->id);

}

编辑2

我的Globalscope看起来像这样:

class FoodScope implements Scope
{
    public function apply(Builder $builder, Model $model)
    {
        $builder->where('reviewed', true)
                ->where('paused', false);
    }
}

1 个答案:

答案 0 :(得分:1)

此行为不是由全局范围引起的。

要获取其他属性,请使用->fresh()

public static function createNew()
{
    return static::create([
         'user_id' => auth()->id(), 
         'reviewed' => false
    ])->fresh();
}