首页 > 解决方案 > 使用 orWhereHas laravel 雄辩查询检查数据是否存在于另一个表中

问题描述

我有两个表用户和出勤率。在出勤表中包含用户出勤 forpresent_datepresent_typewise 。 present_type留作轮班。如果轮班,用户可能有多个出席日期。由于这个原因,一个用户可能在考勤表中有很多行。我想显示所有用户并检查=>如果在特定日期找到了出勤并为用户输入未选中=>如果在循环视图中当天不存在出勤。

$userList = User::              
             orWhereHas('userAttendance', function ($q) use ($attDate,$type) {
                 $q->where('present_date', $attDate);
                 $q->wherePresentType($type);
             })->get();

在刀片文件循环中:

  @foreach($userList as $key => $user)
 <input value="{{$user->id}}" title="" type="checkbox"
                                      @if($user->userAttendance)
                                      checked="checked" data-exist-id="{{$user->userAttendance->id}}"
                                      @endif class="action-normal" />

但这并没有按预期工作。它会检查考勤表上是否存在行,而无需过滤orWhereHasClasure 中写入的日期或类型!

我想检查出勤表上是否存在特定日期的(如果 present_type 是不换班)数据,而无需进行其他查询以保持有限的数据库命中。

我可以通过在用户模型中创建一个函数来做到这一点,其中该函数从刀片文件 while 循环中获取参数。但我不想做额外的数据库查询。

有没有办法使用纯雄辩?我可以使用从控制器功能发送的数据在循环时为用户检查它吗?

标签: laraveleloquent

解决方案


为什么是 orWhereHas ?

尝试这个:

$userList = User::query()              
             ->with(['userAttendance' => function($q) use($attDate,$type) {
                 $q->where('present_date', $attDate);
                 $q->wherePresentType($type);
             }])
             ->get();

最好加载关系,避免视图中的多个查询。

编辑:当条件满足时,这将为您提供所有用户并加载正确的 userAttendance 关系。


推荐阅读