查询不属于 Laravel 范围的关系
Query a relationship that is NOT part of a scope in 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);
});
}
}
这个复杂的条件将select Foo
中所有被认为是活动的记录(实际范围比这更复杂)。
我还有一个 class 像这样:
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();
如果你想要一个做相反事情的作用域,就像这样创建另一个作用域方法,但是使用反向查询逻辑(你没有包括你的 'Some complicated query',所以这只是一个猜测) :
public function scopeInactive($query) {
return $query->where('is_active', false);
}
对于复杂的查询,似乎没有有效的方法可以使用Laravel轻松反转SQL。
你只需要写反函数即可。
对于模型,我有一个复杂的范围条件,如下所示:
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);
});
}
}
这个复杂的条件将select Foo
中所有被认为是活动的记录(实际范围比这更复杂)。
我还有一个 class 像这样:
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();
如果你想要一个做相反事情的作用域,就像这样创建另一个作用域方法,但是使用反向查询逻辑(你没有包括你的 'Some complicated query',所以这只是一个猜测) :
public function scopeInactive($query) {
return $query->where('is_active', false);
}
对于复杂的查询,似乎没有有效的方法可以使用Laravel轻松反转SQL。
你只需要写反函数即可。