如何在与具体情况有关系的地方雄辩地实施?

时间:2019-09-16 05:21:13

标签: php laravel laravel-5

我有时需要按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;
            }
        }
    }

任何帮助将不胜感激!

1 个答案:

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

从技术上讲,我们所做的就是将没有过期许可证的用户带到那里。从字面上看,这意味着所有许可证都已过期。