Laravel - Eloquent子查询过滤器行

The*_*ude 1 mysql subquery filter laravel eloquent

我想让工作人员level等于"高级".我想将用户表与员工合并,因为它包含有关员工的常见信息,如姓名,电子邮件等.

目前我在Eloquent中使用它:

$results = User::with(array('staff' => function($query) {
    $query->where('level', 'Senior');
}))->all();
Run Code Online (Sandbox Code Playgroud)

如果我运行这个我获得所有用户虽然级别等于高级,但我可以在数组中看到人员对象是空的.

目前我做空检查以丢弃不匹配的记录.

反正有没有以更好的方式实现它,所以当我在子查询中过滤一些东西时,主查询将只返回匹配的结果数组,所以我不必再进行任何空检查.

Jar*_*zyk 8

with不会更改SELECT * FROM users查询.它运行另一个查询以获取相关模型:SELECT * FROM staff并应用于where此模型.

// this limits only related staff
$results = User::with(array('staff' => function($query){

  $query->where('level', 'Senior');

}))->get();

// this limits only users (it does not load related staff at all)
$results = User::whereHas('staff', function($query){

  $query->where('level', 'Senior');

})->get();

// and finally this will limit both users set and staff set
$results = User::with(array('staff' => function($query){
  $query->where('level', 'Senior');

}))->whereHas('staff', function($query){
  $query->where('level', 'Senior');

})->get();
Run Code Online (Sandbox Code Playgroud)

现在,如果要合并某些内容,请使用简单连接:

// I dont know what relation you have, so I assume User belongsTo Staff
User::join('staff', 'users.staff_id', '=', 'staff.id')
   ->where('staff.level', 'senior')
   ->get( array('users.*', 'staff.level', ...) ); // select fields you need
Run Code Online (Sandbox Code Playgroud)