Laravel Eloquent:选择相关表中具有x的位置,但从相关表中排除某些行

时间:2018-09-10 23:58:19

标签: php mysql database laravel eloquent

我正在尝试从包含“用户组”及其相关用户的数据库中返回一个集合。但是,我希望选择标准基于相关表中的用户是否经过培训。如果是这种情况,我希望从最终集合中排除该行/条目。

enter image description here

本质上,我想:

  

返回“ GreenGroup”类型的所有组,其中至少一名相关员工未经培训,并在表中仅显示未经培训的员工。

这样它将返回一个这样的对象:

0: {
id: 2,
group: GreenGroup,
size: 4,
employees: {
   0: {name: 'Jane', isTrained: 0},
   1: {name: 'Jeremy', isTrained: 0}
  }
}

但是现在,它正在查找GreenGroup,但是会返回该组中的所有用户。我正在寻找一种在查询生成器中排除它们的方法。到目前为止,这就是我所拥有的:

$results = Group::with(['employees'])->where('group', '=', 'GreenGroup')->whereHas('employees', function($query){
      $query->where('isTrained', '=', '0');
    })->get();

  return json_encode($results);

是否可以在querybuilder中排除关系表条目?还是我被迫(当我遍历这些内容并将其显示在我的网站上时)编写逻辑来检查它们是否受过训练?

1 个答案:

答案 0 :(得分:0)

您需要像下面提到的那样更改查询:

 $results = Group::with(['employees' => function($query){
       $query->where('isTrained', '=', '0');
     }])->where('group', '=', 'GreenGroup')->get();

   return json_encode($results);

您提到的查询将始终返回所有成员,因为您在不符合条件的地方设置了条件。

您编写的查询主要用于获取具有未经训练的成员的所有组(为此,您需要删除where('group','=','GreenGroup')),但是您需要相反的内容,因此需要在With中设置条件。