我试图找到一种搜索关系的方法。
所以,我有一对一的关系(User和UserDetails,其中一些用户可能没有细节)。
所以,问题是......我如何通过他们的详细信息搜索用户,但是没有详细信息的用户必须包含在结果中。
实施例: 表用户: user_id,名称,电子邮件 - 1 John Doe johndoe@address.com - 2 Richard Tim richardtim@address.com - 3 Michael Bird michaelbird@address.com
表user_details: ID,user_id,state - 1,1,加州 - 2,2,纽约
现在......我希望得到所有来自加利福尼亚的用户,以及所有没有州的用户(上述案例结果应该是John Doe和Michael Bird
以下是用户模型中的关系:
public function details()
{
return $this->belongsTo('App\UserDetails', 'user_id', 'user_id');
}
和搜索功能是:
$users = $users->whereHas('details', function($query) use $state {
$query->where('state', $state);
});
请记住,我必须使用eloquent / query构建器实例,我无法使用联接或原始查询。
在这种情况下,我希望获得来自加利福尼亚州和所有非相关用户的所有用户,但查询仅返回/搜索相关用户/ user_details ......
那么,有人可以帮助我吗? 感谢
更新
我是这样尝试的:
$users = new User();
$users = $users->doesntHave('user_details')->orWhereHas('user_details', function($query) use($state) {
$query->whereIn('state', $state);
});
$users->where('created_at', '>=', $start_date);
$users->where('created_at', '<=', $end_date);
答案 0 :(得分:5)
您可以将doesntHave
与orWhereHas
结合使用来创建所需的查询:
User::doesntHave('details')->orWhereHas('details', function($query) {
$query->where('state', '=', $state);
})->where('users.created_at', '>=', $start_date)
->where('users.created_at', '<=', $end_date)
->get();