查询不属于Laravel中作用域的关系
对于模型,我有一个复杂的范围条件,如下所示:查询不属于Laravel中作用域的关系,laravel,laravel-5,laravel-eloquent,Laravel,Laravel 5,Laravel Eloquent,对于模型,我有一个复杂的范围条件,如下所示: 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') ->o
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);
});
}
}
这意味着Bar
模型有许多Foo
模型
现在,如果我想获得所有的Bar
模型以及所有属于它的活动Foo
模型,我可以执行以下操作:
Bar::with(['foo', function (HasMany $query) {
$query->active();
})->get();
但是,如何编写一个查询来提供所有未激活的条记录
理想情况下,我想要这样的东西:
Bar::with(['foo', function (HasMany $query) {
$query->whereNot(function (Builder $query) {
$query->active();
});
})->get();
如果您想要一个作用域做相反的事情,只需创建另一个类似这样的作用域方法,但是使用反向查询逻辑(您没有包括“一些复杂的查询”,所以这只是一个猜测):
对于复杂的查询,似乎没有一种有效的方法可以轻松地使用Laravel反转SQL
你只需要写一个倒数 我稍微编辑了一下,以了解复杂的范围。真正的问题更为复杂。因此我不想再重复一遍,因为没有办法反转作用域。这意味着您必须编写完全相同的复杂查询,但使用反向逻辑。更好的方法是执行以下操作:向模型添加一个额外属性(例如“is_active”)。然后,设置定期更新数据库的计划。例如:每小时查询“太旧”的所有模型,并将其“is_active”属性设置为false。然后,您将能够使用一个简单的作用域来确定您的模型是否处于活动状态。是的,但这更复杂,开销更大,并且可能意味着数据库在尚未更新时给出错误的结果。没错,但我认为您只有这两个选项。我个人会选择后者。复杂的查询将增加页面加载时间。在后台运行相同的查询将避免此类问题。您可以每隔一分钟左右运行schedule命令,以获得非常准确的结果。
Bar::with(['foo', function (HasMany $query) {
$query->whereNot(function (Builder $query) {
$query->active();
});
})->get();
public function scopeInactive($query) {
return $query->where('is_active', false);
}