Date_diff () ожидает, что параметр 2 будет DateTimeInterface, логическое значение - PullRequest
0 голосов
/ 04 февраля 2020

Я создал функцию, в которой я хочу проверить между двумя датами, если между ними есть определенное количество недель.

public function checkShifts()
    {
        $now = new DateTime();
        $shifts = Shift::where("disabled", "=", "0")->get();

        foreach ($shifts as $shift)
        {
            $time = DateTime::createFromFormat('Y-m-d H:MMM:SS', $shift->start, null);

            if (date_diff($now, $time, false) >= 42)
            {
                $shift->disabled = true;
            }
        }
    }

Я получаю дату начала Shift, преобразовываю ее в объект DateTime и пытаюсь запустить date_diff. Тем не менее, я продолжаю получать Date_diff () ожидает, что параметр 2 будет DateTimeInterface, логическая ошибка .

VAR_DUMP:

object(App\Shift)#729 (26) {
  ["table":protected]=>
  string(5) "shift"
  ["connection":protected]=>
  string(5) "mysql"
  ["primaryKey":protected]=>
  string(2) "id"
  ["keyType":protected]=>
  string(3) "int"
  ["incrementing"]=>
  bool(true)
  ["with":protected]=>
  array(0) {
  }
  ["withCount":protected]=>
  array(0) {
  }
  ["perPage":protected]=>
  int(15)
  ["exists"]=>
  bool(true)
  ["wasRecentlyCreated"]=>
  bool(false)
  ["attributes":protected]=>
  array(7) {
    ["id"]=>
    int(21)
    ["start"]=>
    string(19) "2020-02-03 15:00:00"
    ["end"]=>
    string(19) "2020-02-03 21:00:00"
    ["department_id"]=>
    int(1)
    ["disabled"]=>
    int(0)
    ["created_at"]=>
    string(19) "2020-02-03 15:41:06"
    ["updated_at"]=>
    string(19) "2020-02-03 20:39:27"

Ответы [ 2 ]

0 голосов
/ 04 февраля 2020

Как сказал Ли, это неправильный формат, из-за которого отформатированная дата является логическим значением ...

Что вы можете сделать, это привести атрибут start как datetime внутри модели и получить что-то вроде этого:

protected $casts = [
    'start' => 'datetime',
    ...
];

Тогда вы сможете сделать что-то вроде этого:

public function checkShifts()
{
    $shifts = Shift::where("disabled", "=", "0")->get();

    foreach ($shifts as $shift)
    {
        if ($shift->start->diffInWeeks(now()) >= 42)
        {
            $shift->disabled = true;
        }
    }

    return $shifts;
}

С методом карты коллекции:

public function getShifts()
{
    return Shift::where("disabled", "0")->get()->map(function ($shift) {
        $shift->disabled = (bool)$shift->start->diffInWeeks(now()) >= 42;

        return $shift;
    })->values();
}

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

public function enabledShifts()
{
    return Shift::where("disabled", "0")->get()->filter(function ($shift) {
        return $shift->start->diffInWeeks(now()) >= 42;
    })->values();
}
0 голосов
/ 04 февраля 2020

DateTime :: createFromFormat возвращает ложь при ошибке.

Мне кажется, Y-m-d H:MMM:SS - неправильный формат. Y-m-d H:i:s будет 2020-02-03 21:40:20.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...