Проверка, является ли столбец нулевым Laravel - PullRequest
0 голосов
/ 07 октября 2019

У меня есть этот столбец ('time_out') в таблице моей базы данных:

enter image description here

Как видите, time_out is null, и когда я делаю этот запрос:

   $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 ]

3 голосов
/ 07 октября 2019

Прежде всего, когда вы делаете это:

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

Вы получаете Коллекция всех полей time_out всех Attendance моделей, соответствующих вашим критериям (where с). Это означает, что-то вроде этого:

=> 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,
       },
     ],
   }

Вы можете получить дополнительную информацию в Красноречивом разделе документации.

Теперь, еслиВаш запрос предназначен для получения только одной записи. Вы можете использовать метод ->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']);
0 голосов
/ 07 октября 2019

Нажмите

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

В файле Blade If Else

{{ $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

Для контроллера Вы также можете использовать дд или эхо, как показано ниже:

echo $checkertimeout->time_out !=null ? 'Wont Work' : 'work'; // you can replace echo with return too
0 голосов
/ 07 октября 2019

Поскольку $ checkertimeout получил коллекцию как

[
    {"time_out":null}
]

, поэтому она больше не пуста и возвращает

"wont work"
0 голосов
/ 07 октября 2019

Сначала ваш запрос получает все записи.

вы должны сделать так в своем запросе:

$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';
0 голосов
/ 07 октября 2019

Событие time_out равно нулю, переменная $checkertimeout не пуста. Потому что $checkertimeout это коллекция. и в нем есть один предмет.

Как вы можете видеть вот так.

[
    {"time_out":null}
]

Поскольку я не знаю, что вы пытаетесь сделать, Если вы хотите Attendanceтолько там, где time_out не равно нулю, вы можете сделать это.

 $checkertimeout = Attendance::where('emp_id', $request->emp_id)
                    ->where('attend_date', $date)
                    ->whereNotNull('time_out')
                    ->get(['time_out']);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...