Current UTC time is: 2022-08-19 00:50
When I create a new record in my database I set created_at
like:
'created_at' => Carbon::now()
But it stores Datetime like this -> 2022-08-18 20:50
Anyways, after couple of minutes I update this record and set updated_at
like:
'updated_at' => Carbon::now()
And it stores it like this -> 2022-08-19 00:50
which is correct but not completely, because couple of minutes passed and it should be like 2022-08-19 00:53
Here is my migration file:
public function up() {
Schema::create('items', function (Blueprint $table) {
$table->id();
$table->timestamp('created_at');
$table->timestamp('updated_at')->nullable();
});
}
/config/app.php:
'timezone' => 'UTC',
My Item Model:
class Item extends Model {
use HasFactory;
public $timestamps = false;
}
Seriously, whats wrong with this datetime thing in laravel? Why it doesn't work like every other frameworks?
Note: I'm sick of laravels default $table->timestamps()
it works even worse.
CodePudding user response:
The answer listed here might be useful: How to update the updated_at column when the user logs in?
//instead of
'created_at' => Carbon::now()
// simply this:
$user->touch();
CodePudding user response:
It was a problem related to database.
When you create a column this way $table->timestamp('created_at')
, it creates a column in database with this structure:
|----------------------------------------------------------------------------|
| Name Type ... Null Default |
|----------------------------------------------------------------------------|
| created_at timestamp No current_timestamp() |
| |
|----------------------------------------------------------------------------|
If you pay attention to the Default
column, you find out that this function uses the mysql server timestamp to set value for the created_at
column and ignores your entry in laravel create()
method.
To fix this problem you only have to set created_at
to a nullable
column like so:
$table->timestamp('created_at')->nullable();
But remember that you MUST set its value when you create a record otherwise you face an INSERT
error.