我有一个'用户'具有用户提供的服务的数据透视表的表:
// 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的相关行。
答案 0 :(得分:0)
通过使用第一个关系中的where has来解决此问题:
$query->with(['users.services' => function($q) {
$q->whereHas('service', function($q) {
$q->where('visible_to_customers', 1);
})->with('service');
}]);
然后我将 - >(' service')附加到链的末尾。