Laravel - Eloquent子查询过滤器行

时间:2014-08-16 05:26:18

标签: mysql laravel filter subquery eloquent

我希望得到level等于"高级"的工作人员。我想将用户表与员工合并,因为它包含员工的常用信息,如姓名,电子邮件等。

目前我在Eloquent中使用了这个:

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

如果我运行此操作,我会获得所有用户,尽管级别相等更高级,但我可以在数组中看到人员对象为空。

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

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

2 个答案:

答案 0 :(得分:7)

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();

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

// 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

答案 1 :(得分:1)

你的where语句并不完全正确。你忘记了'='

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