Laravel - 有没有办法结合哪里有和有

时间:2016-01-10 22:29:06

标签: php laravel laravel-4

我目前面临一个小问题。我想仅在存在具有特定条件的关系时才返回模型。使用whereHas() - 方法可以正常工作。

$m = Model
    ::whereHas(
        'programs',
        function($q) {
            $q->active();
        }
    );

但是,将关系称为此类属性将为我提供所有(未过滤结果)。

$m->programs;

所以基本上我现在正在做的是:

$m = Model
    ::whereHas(
        'programs',
        function($q) {
            $q->active();
        }
    )
    ->with(array('programs' => function($q) {
        $q->active();
    }))
;

这个工作正常,但我觉得再次做同样的事情非常糟糕。这不是正确的方法。如何在不重复代码的情况下实现这一目标?

1 个答案:

答案 0 :(得分:5)

如果“活动程序”的概念在您的应用程序中很重要,请考虑为活动程序创建一个单独的关系(在这种情况下,我假设您有一个HasMany关系):

class Model
{
    public function activePrograms()
    {
        return $this->hasMany(Program::class)->active();
    }
}

然后,您可以将查询简化为:

Model::with('activePrograms')->has('activePrograms')->get();