Laravel модель Trailing Data при сохранении модели

У меня есть такой код

    $editStuState = StuAtt::where('studentId' , '=' , $id)->first();
    $editStuState -> leave +=1;
    $editStuState -> present = $editStuState -> present-1;
    $editStuState->update();
                            //OR
    $editStuState->save();
    return 'this is good';

Я не могу сохранить или обновить свои данные, когда я удаляю "Обновить" и "Сохранить связанную строку", он может печатать текст.

это dd($editStuState) данные

StuAtt {#382 ▼
  #table: "stu_attendance"
  #connection: "mysql"
  #primaryKey: "id"
  #keyType: "int"
  +incrementing: true
  #with: []
  #withCount: []
  #perPage: 15
  +exists: true
  +wasRecentlyCreated: false
  #attributes: array:7 [▼
    "id" => "7"
    "studentId" => "1"
    "present" => "2"
    "absent" => "1"
    "leave" => "10"
    "created_at" => "2018-04-16 11:17:41.176898"
    "updated_at" => "2018-04-16 06:47:41.000000"
  ]
  #original: array:7 [▼
    "id" => "7"
    "studentId" => "1"
    "present" => "2"
    "absent" => "1"
    "leave" => "10"
    "created_at" => "2018-04-16 11:17:41.176898"
    "updated_at" => "2018-04-16 06:47:41.000000"
  ]
  #changes: []
  #casts: []
  #dates: []
  #dateFormat: null
  #appends: []
  #dispatchesEvents: []
  #observables: []
  #relations: []
  #touches: []
  +timestamps: true
  #hidden: []
  #visible: []
  #fillable: []
  #guarded: array:1 [▶]
}

Я также получил эту форму ошибки Laravel 5.6 это

InvalidArgumentException
Trailing data

Я проверяю свой код построчно, и я думаю, что он не имеет отношения к Carbon согласно моим исследованиям. Как мне это исправить?

2 ответа

Решение

Конечные данные являются ошибкой Carbon, потому что вы, вероятно, используете Postgres, а ваша дата возвращает миллисекунды.

"created_at" => "2018-04-19 07:01:19.929554"

Вы можете добавить следующий метод к вашей (базовой) модели.

public function getDateFormat()
{
     return 'Y-m-d H:i:s.u';
}

Если вы используете Postgres, вам нужно добавить несколько строк в свои модели. Это происходит из-за TIME WITH TIMEZONE в Postgres.

Пожалуйста, прочтите также Date Mutatorsпоскольку Laravel уже поддерживает эту встроенную функцию, просто введите строку ниже в своей модели, чтобы переопределить формат даты по умолчанию для этой модели: https://laravel.com/docs/5.7/eloquent-mutators

Перейдите в свое приложение / модель (в appпапка, эксп. User, SomeModel) добавьте строку ниже:

protected $dateFormat = 'Y-m-d H:i:sO';

Лучший

Если ваша база данных - Postgres, а поле - метка времени, иногда Carbon не может конвертировать в формат по умолчанию (без миллисекунд).

Если миллисекунды не нужны, обновите содержимое поля, чтобы оно не содержало миллисекундную часть.

UPDATE YOURTABLE SET created_at = date_trunc('seconds', created_at),
updated_at = date_trunc('seconds', updated_at)

Это нормализует поля с метками времени без миллисекунд.

Измените свой код с:

$editStuState = StuAtt::where('studentId' , '=' , $id)->first();
$editStuState -> leave +=1;
$editStuState -> present = $editStuState -> present-1;
$editStuState->update();
                        //OR
$editStuState->save();
return 'this is good';

Для того, чтобы:

$editStuState = StuAtt::where('studentId' , '=' , $id)->first();
$editStuState -> leave +=1;
$editStuState -> present = $editStuState -> present-1;
$editStuState->save();
return 'this is good';

Метод ->update(...) используется для массовых обновлений, проверьте Mass Updates

У меня такая же проблема, но я изменил имя столбца на creation_date, проблема решена.

В моем случае проблема заключалась в длине created_at и updated_atв таблице. В Navicat оформление стола было таким:

ht tps:https://stackru.com/images/e1b9bfb75f0cadb710fe8968055a06addce9a456.png

Измените его на 0 и сохраните изменения:

ht tps:https://stackru.com/images/84a0f0428f96bb2027a506490cded50b0e509273.png

Другие вопросы по тегам