查询不属于Laravel范围的关系

时间:2017-02-03 10:34:59

标签: 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')
            ->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();

2 个答案:

答案 0 :(得分:0)

如果你想让一个范围相反,只需创建另一个范围方法,但是使用反向查询逻辑(你没有包含你的'一些复杂的查询',所以这只是猜测):< / p>

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

Laravel: local scopes

答案 1 :(得分:0)

似乎没有一种高效的方法可以使用Laravel轻松地将SQL转换为复杂查询。

你必须写反向。