Désactiver les horodatages éloquents de Laravel

202

Je suis en train de convertir l'une de nos applications Web de CodeIgniter à Laravel. Cependant, pour le moment, nous ne voulons pas ajouter les champs updated_at/ created_atà toutes nos tables car nous avons une classe de journalisation qui fait déjà tout cela de manière plus approfondie pour nous.

Je sais que je peux m'installer $timestamps = false;:

Vendor\laravel\framework\src\illuminate\Datebase\Eloquent\Model.php

Cependant, je préfère ne pas changer un fichier de base pour Laravel, ou que chacun de mes modèles l'ait en haut. Existe-t-il un moyen de désactiver cela ailleurs pour tous les modèles?

projectxmatt
la source

Réponses:

383

Vous devez soit déclarer public $timestamps = false;dans chaque modèle, soit créer un BaseModel, le définir à cet endroit et faire en sorte que tous vos modèles l'étendent au lieu d'être éloquent. N'oubliez pas que les tableaux croisés dynamiques DOIVENT avoir des horodatages si vous utilisez Eloquent.

Mise à jour: Notez que les horodatages ne sont plus REQUIS dans les tableaux croisés dynamiques après Laravel v3.

Mise à jour: vous pouvez également désactiver les horodatages en supprimant $table->timestamps()de votre migration.

bgallagh3r
la source
1
Je ne sais pas pourquoi je n'ai jamais pensé à faire un BaseModel et à le mettre là-bas. Fonctionne à merveille. Juste une note selon les tableaux croisés dynamiques de la documentation n'en a besoin que si vous définissez maintenant avecTimestamps () (je ne sais pas si cela a changé par rapport aux versions précédentes)
projectxmatt
Je ne connaissais pas la méthode withTimestamps (). J'aurai besoin de l'examiner.
bgallagh3r
@ bgallagh3r, est-il de toute façon possible de désactiver uniquement pour la requête perticuler, disons que pour l'affichage de la police, je ne veux pas d'horodatage, mais pour le backend, je veux l'horodatage. Est-il possible de le faire?
user7747472
13
Lors de la suppression de $ table-> timestamps () de la migration, eloquent les inclura toujours dans la requête. Cela conduit à une erreur car le champ n'existe pas. Sinon, bonne réponse.
Thijs Steel
Oui, c'est toujours le cas aujourd'hui (Laravel Framework v7.22.4). J'ai trouvé ce fil en essayant de contourner ce problème. Vous devez désactiver explicitement les horodatages via $timestamps = false;pour, par exemple, amorcer une table qui n'a pas de champs created_atet updated_at.
CLN
127

Placez simplement cette ligne dans votre modèle :

public $timestamps = false;

Et c'est tout!


Exemple:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    public $timestamps = false;

    //
}

Pour désactiver les horodatages pour une opération (par exemple dans un contrôleur):

$post->content = 'Your content'; 
$post->timestamps = false; // Will not modify the timestamps on save
$post->save();

Pour désactiver les horodatages pour tous vos modèles , créez un nouveau BaseModelfichier:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class BaseModel extends Model
{
    public $timestamps = false;

    //
}

Ensuite, étendez chacun de vos modèles avec le BaseModel, comme ceci:

<?php

namespace App;

class Post extends BaseModel
{
    //
}
PhilMarc
la source
25

Si vous utilisez 5.5.x:

const UPDATED_AT = null;

Et pour le champ 'created_at', vous pouvez utiliser:

const CREATED_AT = null;

Assurez-vous que vous utilisez la dernière version. (Cela a été cassé dans Laravel 5.5.0 et corrigé à nouveau dans 5.5.5).

Sampath Perera
la source
23

Si vous avez seulement besoin de désactiver la mise à jour updated_at, ajoutez simplement cette méthode à votre modèle.

public function setUpdatedAtAttribute($value)
{
    // to Disable updated_at
}

Cela remplacera la méthode parent setUpdatedAtAttribute (). created_at fonctionnera comme d'habitude. De la même manière, vous pouvez écrire une méthode pour désactiver la mise à jour de created_at uniquement.

Sampath Perera
la source
2
Cela a fonctionné pour moi car la définition de $ timestamps = false a provoqué l'arrêt de la méthode created_at-> diffForHumans () car ce n'est plus une instance Carbon.
ralixyle
Cela fonctionne pour moi, cette méthode désactive simplement le champ updated_at dont j'ai besoin, merci
Radames E. Hernandez
11

Modèle éloquent:

class User extends Model    
{      
    protected $table = 'users';

    public $timestamps = false;
}

Ou essayez simplement ceci

$users = new Users();
$users->timestamps = false;
$users->name = 'John Doe';
$users->email = '[email protected]';
$users->save();
srmilon
la source
9

Si vous souhaitez supprimer les horodatages du modèle existant, comme mentionné précédemment, placez-le dans votre modèle:

public $timestamps = false;

Créez également une migration avec le code suivant dans la up()méthode et exécutez-la:

Schema::table('your_model_table', function (Blueprint $table) {
    $table->dropTimestamps();
});

Vous pouvez utiliser $table->timestamps()dans votre down()méthode pour autoriser la restauration.

realplay
la source
1
Cela devrait être la meilleure réponse. Si vous disposez d'une base de données de production existante, vous devez exécuter une migration et désactiver les horodatages sur le modèle.
brad le
7

déclarez simplement la publicvariable d'horodatage dans votre Modelto falseet tout fonctionnera parfaitement.

public $timestamps = false;

Shahrukh Anwar
la source
5

Ajoutez cette ligne à votre modèle:

Remplacer la variable existante $timestamps true par false

/**
 * Indicates if the model should be timestamped.
 *
 * @var bool
 */

public $timestamps = false;
Jignesh Joisar
la source
1

Remplacer les fonctions setUpdatedAt()et getUpdatedAtColumn()dans votre modèle

public function setUpdatedAt($value)
{
   //Do-nothing
}

public function getUpdatedAtColumn()
{
    //Do-nothing
}
Krishan
la source
20
Un cas de "ça marche mais personne de sensé ne ferait vraiment ça"
developerbmw
1

Vous pouvez désactiver temporairement les horodatages

$timestamps = $user->timestamps;
$user->timestamps=false;   // avoid view updating the timestamp

$user->last_logged_in_at = now();
$user->save();

$user->timestamps=$timestamps;   // restore timestamps
Snapey
la source