使用嵌套

时间:2017-08-03 10:15:15

标签: php laravel laravel-5 eloquent

我有一个'用户'具有用户提供的服务的数据透视表的表:

// App\User
public function services()
{
    return $this->hasMany('App\ServiceUser');
}

在ServiceUser模型上,我有另一种关系来获取服务信息:

public function service() 
{
    return $this->hasOne('App\Service', 'id');
}

当获取团队(使用Laravel Spark)时,我使用的查询是:

Team::with('users')->withUserCustomerServices()->where('id', $teamId)->first();

此查询的范围在团队模型中:

public function scopeWithCustomerServices($query)
{
    $query = $query;
    $query->with('users.services');
    $query->with(['users.services.service' => function($q) {
        $q->where('visible_to_customers', 1);
    }]);
    return $query;
}

输出时(使用Vue.js):

{{ user.services.length }}

我得到(在这个例子中)返回了6个结果。但是,其中一个服务有一个数据库字段' visible_to_customers'设为0.

最初,我认为我的查询会按预期工作,只返回5个服务,但它实际上仍会全部返回,但如果字段为0,则不会返回关系(服务)。

如何才能在关系具有特定字段值的情况下返回数据透视表结果?

修改

我已更新查询以在第一个嵌套关系中使用whereHas:

$query->with(['users.services' => function($q) {
    $q->whereHas('service', function($q) {
        $q->where('visible_to_customers', 1);
    });
}]);

这很好用,只返回对于visible_to_customers,services表的字段值为1的数据透视表行。

但是,这并不能获取相关的行。

如果我然后链接:

$query->with(['users.services' => function($q) {
    $q->whereHas('service', function($q) {
        $q->where('visible_to_customers', 1);
    });
}]);

$query->with(['users.services.service' => function($q) {
    $q->where('visible_to_customers', 1);
}]);

它仍然是获取所有行的问题,但只有字段为1的相关行。

1 个答案:

答案 0 :(得分:0)

通过使用第一个关系中的where has来解决此问题:

$query->with(['users.services' => function($q) {
    $q->whereHas('service', function($q) {
        $q->where('visible_to_customers', 1);
    })->with('service');
}]);

然后我将 - >(' service')附加到链的末尾。