我希望得到level
等于"高级"的工作人员。我想将用户表与员工合并,因为它包含员工的常用信息,如姓名,电子邮件等。
目前我在Eloquent中使用了这个:
$results = User::with(array('staff' => function($query) {
$query->where('level', 'Senior');
}))->all();
如果我运行此操作,我会获得所有用户,尽管级别与相等更高级,但我可以在数组中看到人员对象为空。
目前我做空检查以丢弃不匹配的记录。
有没有以更好的方式实现这一点,所以当我在子查询中过滤一些东西时,主查询将只返回匹配的结果数组,所以我不必再进行任何空检查了
答案 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();