检查列是否为空 Laravel

kwe*_*ble 2 collections laravel eloquent laravel-5

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

在此处输入图片说明

正如你所看到的time_outnull,当我做这个查询:

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

我得到这个输出:

[{"time_out":null}]

但是当我在一个 if-else statement:

if ($checkertimeout->isEmpty())
{
    echo "works";
}
else
{
    echo "wont work";
}
Run Code Online (Sandbox Code Playgroud)

它显示不起作用

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

Ken*_*rna 6

首先,当你这样做时:

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

您将获得符合您的条件(s)的每个模型的所有字段的集合。这意味着,像这样:time_outAttendancewhere

=> 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,
       },
     ],
   }
Run Code Online (Sandbox Code Playgroud)

您可以在文档的Eloquent 部分获得更多信息。

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

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

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

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

有了这些澄清,让我们来回答你的问题。如果你想检查一个字段是否为空......你可以使用 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))
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

使用单个对象

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

if(is_null($checkertimeout->time_out)) // <----
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

边注

作为旁注,如果您想避免该值的空结果,您可以在查询中添加另一个约束:

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