Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

smanes's avatar

Trouble with Carbon in 5.8

I upgraded an application from 5.4 to 5.8. But I'm getting errors when I try to write to the database. The errors appear to be coming from Carbon:

Data missing {"userId":1,"exception":"[object] (InvalidArgumentException(code: 0): Unexpected data found.
Data missing at /web/hrl2/vendor/nesbot/carbon/src/Carbon/Traits/Creator.php:576)
[stacktrace]
#0 /web/hrl2/vendor/nesbot/carbon/src/Carbon/Traits/Creator.php(598): Carbon\Carbon::rawCreateFromFormat('Y-m-d H:i:s', '2017-09-18 11:4...', NULL)

I presume that it has something to do with the date format.

The database is Postgresql 9. Here's the abbreviated DDL for the table:

                                          Table "public.urls"
     Column     |            Type             | Collation | Nullable |             Default              
----------------+-----------------------------+-----------+----------+----------------------------------
 id             | integer                     |           | not null | nextval('urls_id_seq'::regclass)
 link_text      | character varying(255)      |           | not null | 
 link_url       | character varying(255)      |           | not null | 
 node_id        | integer                     |           |          | 
 created_by     | character varying(255)      |           |          | 
 created_at     | timestamp(0) with time zone |           |          | 
 updated_at     | timestamp(0) with time zone |           |          | 

In the Url.php model:

class Url extends Model
{
    protected $table = 'urls';

    protected $fillable = [ 'node_id', 'link_url', 'link_text', 'created_at', 'updated_at', 'created_by', 'is_published'];

...
}

The controller is unchanged since 5.4:

        $input               = $request->all();
        $input['updated_at'] = Carbon::now();
        $input['created_by'] = Auth::user()->name;

        $url = Url::findOrFail($url_id);
        $url->update($input);

Has anyone run into this problem, especially after migrating to 5.8?

0 likes
9 replies
ahmeddabak's avatar

Yes it is a carbon error, and it does not has anything to do with that database

This error arises when Carbon's createFromFormat function receives a date string that doesn't match the passed format string.

i am not sure where the error is, the code you posted seems ok, but remove this line $input['updated_at'] = Carbon::now(); since the updated_at will be automatically updated when you call update

smanes's avatar

I tried that and it didn't work. I also tried everything on https://laracasts.com/discuss/channels/laravel/carbon-trailing-data-error?page=0. I still get the same error.

I filed a Github bug report with nesbot/carbon and got back this response:

Unfortunately we don't support this version anymore. Please check out our support policy on which versions we are currently supporting. Can you please try to upgrade to the latest version and see if your problem persists? We'll help you out and re-open this issue if so.

So my question would be, what's the latest version of Carbon that Laravel 5.8 will support? I actually don't have a nesbot/carbon in composer.json but it is in composer.lock:

"require": {
        ...
        "nesbot/carbon": "^1.26.3 || ^2.0",
    ...
},

I also tried removing created_at and updated_at from $fillable and it still fails with the same error.

ahmeddabak's avatar

It can be that error is happening somewhere else, please go to you log file and post the error with the call stack

smanes's avatar

Here's the call stack:

[2020-01-25 12:05:00] local.ERROR: Trailing data {"userId":1,"exception":"[object] (InvalidArgumentException(code: 0): Trailing data at /web/hrl2/vendor/nesbot/carbon/src/Carbon/Traits/Creator.php:594) [stacktrace] #0 /web/hrl2/vendor/nesbot/carbon/src/Carbon/Traits/Creator.php(616): Carbon\Carbon::rawCreateFromFormat('Y-m-d H:i:s', '2017-09-18 11:4...', NULL) #1 /web/hrl2/vendor/laravel/framework/src/Illuminate/Support/DateFactory.php(216): Carbon\Carbon::createFromFormat('Y-m-d H:i:s', '2017-09-18 11:4...') #2 /web/hrl2/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php(239): Illuminate\Support\DateFactory->__call('createFromForma...', Array) #3 /web/hrl2/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php(809): Illuminate\Support\Facades\Facade::__callStatic('createFromForma...', Array) #4 /web/hrl2/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php(831): Illuminate\Database\Eloquent\Model->asDateTime('2017-09-18 11:4...') #5 /web/hrl2/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php(1170): Illuminate\Database\Eloquent\Model->fromDateTime('2017-09-18 11:4...') #6 /web/hrl2/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasAttributes.php(1131): Illuminate\Database\Eloquent\Model->originalIsEquivalent('updated_at', '2020-01-25 12:0...') #7 /web/hrl2/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(742): Illuminate\Database\Eloquent\Model->getDirty() #8 /web/hrl2/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(660): Illuminate\Database\Eloquent\Model->performUpdate(Object(Illuminate\Database\Eloquent\Builder)) #9 /web/hrl2/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php(607): Illuminate\Database\Eloquent\Model->save(Array) #10 /web/hrl2/app/Http/Controllers/LinkController.php(217): Illuminate\Database\Eloquent\Model->update(Array) #11 [internal function]: App\Http\Controllers\LinkController->update(Object(Illuminate\Http\Request), '39') #12 /web/hrl2/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(54): call_user_func_array(Array, Array) #13 /web/hrl2/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(45): Illuminate\Routing\Controller->callAction('update', Array) #14 /web/hrl2/vendor/laravel/framework/src/Illuminate/Routing/Route.php(219): Illuminate\Routing\ControllerDispatcher->dispatch(Object(Illuminate\Routing\Route), Object(App\Http\Controllers\LinkController), 'update') #15 /web/hrl2/vendor/laravel/framework/src/Illuminate/Routing/Route.php(176): Illuminate\Routing\Route->runController() #16 /web/hrl2/vendor/laravel/framework/src/Illuminate/Routing/Router.php(680): Illuminate\Routing\Route->run() #17 /web/hrl2/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(30): Illuminate\Routing\Router->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) #18 /web/hrl2/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(41): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) #19 /web/hrl2/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(163): Illuminate\Routing\Middleware\SubstituteBindings->handle(Object(Illuminate\Http\Request), Object(Closure)) #20 /web/hrl2/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) #21 /web/hrl2/vendor/laravel/framework/src/Illuminate/Auth/Middleware/Authenticate.php(43): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) #22 /web/hrl2/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(163): Illuminate\Auth\Middleware\Authenticate->handle(Object(Illuminate\Http\Request), Object(Closure)) #23 /web/hrl2/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) #24 /web/hrl2/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php(75): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) #25 /web/hrl2/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(163): Illuminate\Foundation\Http\Middleware\VerifyCsrfToken->handle(Object(Illuminate\Http\Request), Object(Closure)) #26 /web/hrl2/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) #27 /web/hrl2/vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php(49): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) #28 /web/hrl2/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(163): Illuminate\View\Middleware\ShareErrorsFromSession->handle(Object(Illuminate\Http\Request), Object(Closure)) #29 /web/hrl2/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) #30 /web/hrl2/app/Http/Middleware/Language.php(28): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) #31 /web/hrl2/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(163): App\Http\Middleware\Language->handle(Object(Illuminate\Http\Request), Object(Closure)) #32 /web/hrl2/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) #33 /web/hrl2/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(56): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) #34 /web/hrl2/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(163): Illuminate\Session\Middleware\StartSession->handle(Object(Illuminate\Http\Request), Object(Closure)) #35 /web/hrl2/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) #36 /web/hrl2/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php(37): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) #37 /web/hrl2/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(163): Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse->handle(Object(Illuminate\Http\Request), Object(Closure)) #38 /web/hrl2/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) #39 /web/hrl2/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php(66): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) #40 /web/hrl2/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(163): Illuminate\Cookie\Middleware\EncryptCookies->handle(Object(Illuminate\Http\Request), Object(Closure)) #41 /web/hrl2/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) #42 /web/hrl2/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(104): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) #43 /web/hrl2/vendor/laravel/framework/src/Illuminate/Routing/Router.php(682): Illuminate\Pipeline\Pipeline->then(Object(Closure)) #44 /web/hrl2/vendor/laravel/framework/src/Illuminate/Routing/Router.php(657): Illuminate\Routing\Router->runRouteWithinStack(Object(Illuminate\Routing\Route), Object(Illuminate\Http\Request)) #45 /web/hrl2/vendor/laravel/framework/src/Illuminate/Routing/Router.php(623): Illuminate\Routing\Router->runRoute(Object(Illuminate\Http\Request), Object(Illuminate\Routing\Route)) #46 /web/hrl2/vendor/laravel/framework/src/Illuminate/Routing/Router.php(612): Illuminate\Routing\Router->dispatchToRoute(Object(Illuminate\Http\Request)) #47 /web/hrl2/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(176): Illuminate\Routing\Router->dispatch(Object(Illuminate\Http\Request)) #48 /web/hrl2/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(30): Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http\{closure}(Object(Illuminate\Http\Request)) #49 /web/hrl2/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) #50 /web/hrl2/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(163): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle(Object(Illuminate\Http\Request), Object(Closure)) #51 /web/hrl2/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) #52 /web/hrl2/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) #53 /web/hrl2/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(163): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle(Object(Illuminate\Http\Request), Object(Closure)) #54 /web/hrl2/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) #55 /web/hrl2/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) #56 /web/hrl2/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(163): Illuminate\Foundation\Http\Middleware\ValidatePostSize->handle(Object(Illuminate\Http\Request), Object(Closure)) #57 /web/hrl2/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) #58 /web/hrl2/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/CheckForMaintenanceMode.php(62): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) #59 /web/hrl2/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(163): Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode->handle(Object(Illuminate\Http\Request), Object(Closure)) #60 /web/hrl2/vendor/laravel/framework/src/Illuminate/Routing/Pipeline.php(53): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}(Object(Illuminate\Http\Request)) #61 /web/hrl2/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(104): Illuminate\Routing\Pipeline->Illuminate\Routing\{closure}(Object(Illuminate\Http\Request)) #62 /web/hrl2/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(151): Illuminate\Pipeline\Pipeline->then(Object(Closure)) #63 /web/hrl2/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(116): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter(Object(Illuminate\Http\Request)) #64 /web/hrl2/public/index.php(53): Illuminate\Foundation\Http\Kernel->handle(Object(Illuminate\Http\Request)) #65 {main} "}

ahmeddabak's avatar

It seems like after updating the record, laravel is attempting find find what attributes have changed in the getDirty method, for that it is fetching that value of updated_at and casting it to carbon before comparing it with the new value, in this process an error is thrown

#0 /web/hrl2/vendor/nesbot/carbon/src/Carbon/Traits/Creator.php(616): Carbon\Carbon::rawCreateFromFormat('Y-m-d H:i:s.u', '2017-09-18 11:4...', NULL)

the format is standard 'Y-m-d H:i:s.u' but the date is not completely showing '2017-09-18 11:4...' , can you check in the database that the updated_at value for this record is in the right format

it is the record with the "userId":1

smanes's avatar

Yeah, that 'Y-m-d H:i:s.u' data format was there because I was testing an override in the model file:

protected $dateFormat = 'Y-m-d H:i:s.u';

I also tried it without the override and with this from that Laracasts link above:

protected $dateFormat = 'Y-m-d H:i:s.u0';

Same problem. The Postgresql data type on those date fields is "timestamp(0) with time zone" so it shouldn't be storing fractional seconds.

I should have mentioned that this is only happening on updates to existing database records, not on inserts. For instance I created this record with no problems:

hrl2=# select * from urls where id=1304;
  id  |     link_text      |       link_url        | node_id | group | site | location | is_published | created_by | link_weight |       created_at       |       updated_at       | ref_section_id | lang |  media  |       description        | video_id 
------+--------------------+-----------------------+---------+-------+------+----------+--------------+------------+-------------+------------------------+------------------------+----------------+------+---------+--------------------------+----------
 1304 | Laracasts web site | https://laracasts.com |       6 | all   | nyc  | related  | t            | admin      |           0 | 2020-01-25 12:37:24-05 | 2020-01-25 12:37:24-05 |                | en   | website | Test test test test test |         
(1 row)

hrl2=# \gx
-[ RECORD 1 ]--+-------------------------
id             | 1304
link_text      | Laracasts web site
link_url       | https://laracasts.com
node_id        | 6
group          | all
site           | nyc
location       | related
is_published   | t
created_by     | admin
link_weight    | 0
created_at     | 2020-01-25 12:37:24-05
updated_at     | 2020-01-25 12:37:24-05
ref_section_id | 
lang           | en
media          | website
description    | Test test test test test
video_id       | 

But when I try to update it I get the error.

UPDATE: I just discovered this. If I null out that updated_at column in the database, and have that first $dataFormat pattern ('Y-m-d H:i:s.u') in the model and then update the record from Laravel it works fine. You can update that row over and over again and there's no issue.

update urls set updated_at = null where id=330;

What's strange is that the timestamp column looks the same in psql. But that doesn't mean that it's not different internally.

So this does seem to indicate a database issue. The web server is running on Ubuntu 18.04. When I upgraded it from 16.04 this past summer it updated Postgres to v10 while the existing database records were created on v8 and v9. That seemed to work fine with Laravel 5.4. But with the upgrade to 5.8, it broke Carbon on those legacy database columns.

Since the updated_at columns aren't critical to the application I think I can just get away with adding that $dateFormat to the model files and then update all the updated_at columns in the table to null.

ahmeddabak's avatar

If you think that this is solved please mark it as solved

smanes's avatar

Let me do some testing and if it's successful I'll post a less rambling solution.

smanes's avatar
smanes
OP
Best Answer
Level 2

Okay, here was my fix to this issue. Again, here are bounding parameters to this problem. Not all may be significant to generating this problem but for the sake of completeness here they are:

  1. A 5.4 Laravel framework composer-updated to 5.8.
  2. A legacy pre-v.10 Postgresql database, in my case data from both v.8 and v.9 Postgresql.
  3. An Ubuntu server updated from 16.04 LTS to 18.04 LTS.

The fix: null out all updated_at columns in your Postgresql tables. It was the existing content of those pre-V.10 "timestamp(0) with time zone"-typed columns that was triggering my problem. Here's a script you can copy-pasta into psql to find tables containing updated_at columns:

DO $$
DECLARE
    d_curs  REFCURSOR;
    d_rec   RECORD;
BEGIN
    OPEN d_curs FOR
    SELECT * from information_schema.tables
    WHERE table_schema = 'public'
    AND table_type = 'BASE TABLE';

    LOOP
        FETCH d_curs INTO d_rec;
        EXIT WHEN NOT FOUND;

        IF EXISTS( SELECT *
            FROM information_schema.columns
            WHERE table_name = d_rec.table_name and column_name = 'updated_at')
        THEN
            RAISE NOTICE 'updated_at column found in %', d_rec.table_name;
        END IF;
    END LOOP;
END $$;

Next, you need to add this to all your model files which reference an updated_at column and Carbon:

 protected $dateFormat = 'Y-m-d H:i:s.u';

I can't offer a detailed technical analysis of why this works because I'm kind of under the gun with this project so I don't have time to spend looking more deeply into this. But my guess is that Postgresql v10 changed the internal format of its timestamp with time zone datatype and it's breaking Carbon. Nulling out those columns lets Carbon reinitialize them.

Please or to participate in this conversation.