检查列是否为空Laravel

时间:2019-10-07 03:45:19

标签: laravel laravel-5 collections eloquent

我的数据库表中有此列('time_out'):

enter image description here

您可以看到time_outnull,当我执行此查询时:

   $checkertimeout = Attendance::where('emp_id', $request->emp_id)
                    ->where('attend_date', $date)->get(['time_out']);

我得到以下输出:

  

[{“ time_out”:null}]

但是当我在if-else statement:

中使用它时
if ($checkertimeout->isEmpty())
{
    echo "works";
}
else
{
    echo "wont work";
}

显示不起作用

感谢您的帮助,我是Eloquent查询的新手:)

5 个答案:

答案 0 :(得分:3)

首先,当您这样做时:

$checkertimeout = Attendance
          ::where('emp_id', $request->emp_id)
          ->where('attend_date', $date)
          ->get(['time_out']); // <---

您将获得符合您的条件(time_out)的每个Attendance模型的所有where字段中的Collection。意思是这样的:

=> Illuminate\Database\Eloquent\Collection {#3323
     all: [
       App\Attendance {#3332
         attend_date: "2019-10-06 22:01:29",
       },
       App\Attendance {#3340
         attend_date: "2019-10-06 22:01:29",
       },
       App\Attendance {#314
         attend_date: null,
       },
     ],
   }

您可以在文档的Eloquent section中获取更多信息。

现在,如果查询被设计为仅获取一条记录,则可以使用->first()方法而不是get()方法。此方法将返回与您的条件匹配的第一个Attendance对象。

$checkertimeout = Attendance
          ::where('emp_id', $request->emp_id)
          ->where('attend_date', $date)
          ->first(); // <---

PS:如果只需要检索time_out值,也可以将->select('attend_date')添加到查询中:

$checkertimeout = Attendance
          ->select('time_out'); // <---
          ::where('emp_id', $request->emp_id)
          ->where('attend_date', $date)
          ->first(); // <---

有了这些澄清,让我们开始您的问题。如果要检查字段是否为空,则可以使用PHP函数is_null()

使用收藏集

$checkertimeout = Attendance
          ::where('emp_id', $request->emp_id)
          ->where('attend_date', $date)
          ->get(['time_out']);

if(is_null($checkertimeout->first()->time_out))
{
    // ...
}

使用单个对象

$checkertimeout = Attendance
          ->select('time_out'); // <---
          ::where('emp_id', $request->emp_id)
          ->where('attend_date', $date)
          ->first(); // <---

if(is_null($checkertimeout->time_out)) // <----
{
    // ...
}

旁注

请注意,如果要避免对该值返回空结果,可以在查询中添加另一个约束:

$checkertimeout = Attendance
          ::where('emp_id', $request->emp_id)
          ->where('attend_date', $date)
          ->whereNotNull('time_out') // <-----
          ->get(['time_out']);

答案 1 :(得分:0)

time_out的事件为空,$checkertimeout变量不为空。因为$checkertimeout是一个集合。并且其中有一项。

如您所见,

[
    {"time_out":null}
]

由于我不知道您要做什么,因此,如果仅在Attendance不为null的情况下只希望time_out,则可以执行此操作。

 $checkertimeout = Attendance::where('emp_id', $request->emp_id)
                    ->where('attend_date', $date)
                    ->whereNotNull('time_out')
                    ->get(['time_out']);

答案 2 :(得分:0)

首先,您的查询正在获取所有记录。

您应该在查询中这样做:

$checkerTimeOut = Attendance
            ::where([['emp_id', $request->emp_id], ['attend_date', $date]])
            ->first();

//这是为了获得一条记录

然后,如果您使用if else语句,则还应该调用要稳定的列。

if($checkerTimeOut->time_out->isEmpty()
{
  dd('not empty');
}
else
{
  dd('this record is empty');
}

您也可以这样:

if($checkerTimeOut->time_out)
{
  dd('not empty');
}
else
{
  dd('this record is empty');
}

或者应该像这样:

$checkerTimeOut->time_out
    ? 'not empty'
    : 'this record is empty';

答案 3 :(得分:0)

因为$ checkertimeout获得了一个收藏夹

[
    {"time_out":null}
]

因此它不再为空,它将返回

"wont work"

答案 4 :(得分:0)

点击

$checkertimeout = Attendance::where('emp_id', $request->emp_id)
                ->where('attend_date', $date)->first();

如果刀片文件不存在

{{ $checkertimeout->time_out !=null ? 'Wont Work' : 'work' }} // when this condition $checkertimeout->time_out !=null true its run after "?" when its false it's running after ":" term

对于控制器,您还可以如下所示dd或echo:

echo $checkertimeout->time_out !=null ? 'Wont Work' : 'work'; // you can replace echo with return too