Skip to main content

How to Selectively Disable Timestamp Columns in Laravel Models

Introduction:

In Laravel, the updated_at and created_at columns are timestamp columns that automatically update whenever a model is saved or created. However, there might be scenarios where you want to selectively disable one or both of these columns for specific models. Fortunately, Laravel provides a straightforward way to achieve this by customizing your model's const UPDATED_AT and const CREATED_AT constants. In this blog post, we will explore how to selectively disable timestamp columns in Laravel models, discuss the benefits of this approach, and guide you through the necessary steps.


Step 1: Create a Laravel Model and Migration

To demonstrate this process, let's assume we have a model called Download that represents a downloadable file in our application. If you don't have a model already, you can create one using the php artisan make:model Download command in your terminal.

To generate the migration for the downloads table, run the following command: php artisan make:migration create_downloads_table. This will create a new migration file in the database/migrations directory.


Step 2: Edit the Migration File

Open the newly created migration file (database/migrations/xxxxxxxx_create_downloads_table.php) and locate the up() method. By default, Laravel includes the timestamps() method in the create blueprint, which adds created_at and updated_at columns to the table. However, you can modify the migration file accordingly if you want to selectively disable one or both of these columns.

To disable the updated_at column, remove the ->timestamps() line from the migration file. If you also want to disable the created_at column, remove the ->timestamps() line and add a ->timestamp('created_at')->nullable() line to the migration file.

Your updated migration file should look something like this:

<?php

use Illuminate\Database\Migrations\Migration;

use Illuminate\Database\Schema\Blueprint;

use Illuminate\Support\Facades\Schema;


class CreateDownloadsTable extends Migration

{

    public function up()

    {

        Schema::create('downloads', function (Blueprint $table) {

            $table->id();

            $table->string('file_name');

            // remove this line
            // $table->timestamps();

            // Add this line if you want to keep created_at column

            // $table->timestamp('created_at')->nullable();


            // Add this line if you want to keep updated_at column

            // $table->timestamp('updated_at')->nullable();


            // Other columns if needed

        });

    }

    // Rest of the migration file

}


Step 3: Customize Timestamp Columns in the Model

Open the Download model file (app/Models/Download.php) and customize the const UPDATED_AT and const CREATED_AT constants based on your requirements.

To disable the updated_at column, add the following line within the class definition:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;


class Download extends Model

{

    const UPDATED_AT = null;

    // Other model code

}

If you also want to disable the created_at column, add the following line as well:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;


class Download extends Model

{

    const UPDATED_AT = null;

    const CREATED_AT = null;

    // Other model code

}

By customizing these constants, Laravel will no longer manage the values of the corresponding timestamp columns when saving or creating instances of the Download model.


Step 4: Run the Migration

To apply the changes to the database, run the migration using the php artisan migrate command. This will create the downloads table with the selectively disabled timestamp columns.


Conclusion:

Selective disabling of timestamp columns in Laravel models allows you to have fine-grained control over their behaviour. By customizing the const UPDATED_AT and const CREATED_AT constants in your model and modifying the migration file accordingly, you can disable one or both of these columns for specific models. This approach is useful in scenarios where you want to exclude certain models from automatic timestamp updates or when you have custom timestamp handling requirements. Remember to consider the specific needs of your project and apply this approach selectively to maintain the integrity of your data and optimize performance.

Comments

Popular Articles

[SOLVED] Linux - Issues installing Docker on Ubuntu - libseccomp2 version 2.3.1 installed but 2.4 required

This article has been improved for a better understanding - goto  https://splashcoder.blogspot.com/2023/07/installing-docker-on-ubuntu-1804-solved.html There is a possibility that you are trying to install docker. There is a very comprehensive guide at https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository. The linked guide serves as a reference for this article. We try to address the common errors in this article. Just so you won’t have to scour the entire answers on StackOverflow. Step 1: The first thing is to run our famous "apt update" command. So run the command below. sudo apt-get update You may observe that there are some errors. And YES! we are using a fairly old Ubuntu 18.04 Bionic Beaver Release. It seems perfect for this as most people have issues installing docker anyways. To resolve this, you may refer to  Configure DNS server IP to resolve errors with apt-get update Step 2: Following the Docker article, we should run the commands below. sudo...

VS CODE: Unable to install extensions on Ubuntu/Linux

Hey, its one of those days, i just wished i could code away the night. i decided that tonight, it was going to be VS Code all through. I closed Sublime text. It was not long before I started missing the php code linting and ever intelligent code completions that were built into sublime text. I checked the suggestions on the Extensions Tab of VS Code. and there it was! Felix Becker's "PHP IntelliSense" package. To my cute surprise, Upon clicking, the extension's description and Installation "Read Me" could not display correctly, 'twas as good as blank. All i could see was this: I thought, this is something light, so i started searching but then it was not better explained except for the GitHub issue which I found to be useful, Link is at the bottom of this page.  I hate to discover it was a DNS issue. How to detect the Issue Simply visit the URL below, if you are able to view the image on the page, then you are not affected by this issue. DNS Test URL: ht...

Laravel: Implementing the country based phone input

When you ideate on your next Laravel project, don't forget that feeling, where you are lost in cloud thinking most of the work has been built into the framework. One such task not built into the framework is the country selector and any other data-driven task/feature. The image below is the desired end result.   Components Below are the different components and how to create them. 1. Countries Table and Model : running the command below on a command-line tool from within a Laravel project should help achieve this. php artisan make:model Models\Country -m our Table can be created with the SQL below; CREATE TABLE `countries` ( `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, `name` VARCHAR(255) NOT NULL, `iso2` VARCHAR(255) NOT NULL, `created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) COLLATE='utf8mb4_unicode_ci' ENGINE=InnoDB; 2. Regions table and Model:  A country might have many regions, each region is not expected to have more than...