2017-02-03 50 views
0

一个范围对于模型我有一个复杂的范围条件,像这样的一部分:查询的关系,是不是在Laravel

class Foo { 
    public function scopeActive(Builder $query) { 
     $dateNow = $now->format('Y-m-d'); 
     $timeNow = $now->second(0)->format('H:i:s'); 
     $query->whereNull('start_date') 
      ->orWhere('start_date', '<', $dateNow) 
      ->orWhere(function (Builder $query) use ($dateNow, $timeNow) { 
       $query->where('start_date', '=', $dateNow) 
        ->where('start_time', '>=', $timeNow); 
      }); 
    } 
} 

这种复杂的情况将选择所有在Foo被认为处于活动状态的记录(在真正的范围比这更复杂)。

我有另一个类,像这样:

class Bar { 
    public function foos() { 
     return $this->hasMany(Foo::class); 
    } 
} 

这意味着Bar模型有很多Foo车型。

现在,如果我想获得的所有Bar模型,以及所有活动Foo模型属于它,我可以做到以下几点:

Bar::with(['foo', function (HasMany $query) { 
    $query->active(); 
})->get(); 

但是,我怎么可以编写一个查询,让我所有的Bar记录是不活跃的。

理想我想是这样的:

Bar::with(['foo', function (HasMany $query) { 
    $query->whereNot(function (Builder $query) { 
     $query->active(); 
    }); 
})->get(); 

回答

0

似乎没有成为一个高效的方式轻松颠倒SQL使用Laravel进行复杂的查询。

你只好得写出反过来。

0

如果你想有一个范围是刚好相反,它只是创造另一个范围的方法,像这样,但倒查询逻辑(你不包括您的“有些复杂的查询”,所以这只是一个猜测):

public function scopeInactive($query) { 
    return $query->where('is_active', false); 
} 

Laravel: local scopes

+0

我稍微编辑它以提供一个复杂范围的概念。真正的更复杂。因此,我不想再重复一遍 –

+0

不幸的是,无法翻转示波器。这意味着你必须写出完全相同的复杂查询,但是要反向逻辑。 – Jeffrey

+0

一个更好的主意是执行以下操作: 为模型添加一个额外的属性(例如'is_active')。然后,设置定期更新数据库的计划。例如:每个小时,查询所有'太旧'的_models_并将它们的'is_active'属性设置为false。然后,您将可以使用一个简单的范围来确定您的_model_是否处于活动状态。 – Jeffrey