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

Installing Docker on Ubuntu 18.04 ([SOLVED]- libseccomp2 version 2.3.1 installed but 2.4 required)

 Introduction: If you're attempting to install Docker on Ubuntu 18.04 Bionic Beaver, which is known for having installation issues, this comprehensive guide aims to address common errors you may encounter during the process. Our goal is to save you time searching for answers on StackOverflow by providing clear instructions. The guide is based on the official Docker documentation available at https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository. Step 1: Updating Package Lists To begin, run the following command to update your package lists using the "apt-get update" command: sudo apt-get update Note: If you encounter any errors during the update process, it may be due to the older Ubuntu 18.04 release. In such cases, you can refer to the Configure DNS server IP to resolve errors with apt-get update  guide for assistance. This guide will help you address any DNS-related issues that might be preventing successful updates. Step 2: Installing Dependencie...

Is this a CSS Bug: setting Background and z-index for Pseudo selectors(::before & :: after)

Recently I was making some UI for a friend's project. We had this CSS button effect that works elsewhere but failed to work at the desired location. Upon troubleshooting, we discovered that if the parent element has a background defined, you can't control the z-index of the pseudo selection of any of its children. Wait for it, I have got some demo. TL;DR set background colour or image for a " DIV.parent ", create a " Div.child " inside the " DIV.parent ". use CSS to modify the " ::before" " element of the " Div.child " as follows; set position as absolute, content as an empty string, height:100% and width is best at 50% for example purposes, lastly, give it a background colour. You will observe that the " ::before" " element is overlaying the actual element's content. Try to adjust the z-index of the " ::before" ". You will also realize that the z-index works fine if we remove the backgroun...

Linux - How many network cards/interfaces do I have and what's their IP

 Yup! You have your Linux server or desktop installed, you have been enjoying this setup and suddenly you need to know how many network adapters are installed. You probably also want to know which of these adapters is connected to the internet, please follow through. First, you should run the command below on the terminal ip addr TL; DR: T here are 2 network adapters here,  “enp0s3” is my internet network adapter because it has an IP address from my internet gateway/router/MiFi. The IP address pattern gives this information.it begins with 192.x.x.x. Also "epn0s8" is the local network adapter which allows connections within an ethernet,  This output is quite verbose. Let’s dissect it in a bit. Firstly, we can observe items 1, 2 and 3. It is worth mentioning that item 1 is not an adapter, it is synonymous with the local network. Item 1 is labelled as “lo:”, this means that details in this section have to do with your localhost. Internal network setting of your system. This ...