我有时需要按1-n关系按条件过滤结果
所以我在User.php中具有这种1-n关系
public function permits()
{
return $this->hasMany('App\Permit');
}
我要检索的结果是所有许可证都已过期(许可证表的过期= 0)的用户,因为1个用户可以拥有许多许可证,而我需要满足的条件是所有许可证都必须过期
我当前的查询是这样的,它提取了数百个错误数据,因为我还不知道如何在所有允许的过期时间为0的情况下实现
$users = User::where('club_id',$this->id)->whereHas('permits',function($q){
$q->where('expiry','<=','0');
})->get();
当前解决方案是不好的解决方案(执行时间更长),这样你们就更清楚了我想要实现的目标
foreach($users as $key => $user){
foreach($user->permits as $permit){
if($permit->expiry > 0){
$users->forget($key); // unset from the users collection
break;
}
}
}
任何帮助将不胜感激!
答案 0 :(得分:1)
如果您希望用户所有许可均已过期
我们可以通过whereDoesntHave()
函数来实现。
$users = User::where('club_id',$this->id)
->whereDoesntHave('permits', function($query){
// query for not expired.
// I believe the column expiry value is 0 when premit is not expired.
$query->where('expiry', 0);
})
->get();
从技术上讲,我们所做的就是将没有过期许可证的用户带到那里。从字面上看,这意味着所有许可证都已过期。