Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
查询不属于Laravel中作用域的关系_Laravel_Laravel 5_Laravel Eloquent - Fatal编程技术网

查询不属于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);
}