Disabilita i timestamp Eloquent di Laravel


186

Sto convertendo una delle nostre applicazioni Web da CodeIgniter a Laravel. Tuttavia in questo momento non vogliamo aggiungere i campi updated_at/ created_ata tutte le nostre tabelle poiché abbiamo una classe di registrazione che fa già tutto questo in modo più approfondito per noi.

Sono consapevole di poter impostare $timestamps = false;:

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

Tuttavia preferirei non modificare un file core per Laravel, o avere tutti i miei modelli che lo hanno in cima. C'è un modo per disabilitarlo altrove per tutti i modelli?

Risposte:


360

Devi dichiarare public $timestamps = false;in ogni modello o creare un BaseModel, definirlo lì e fare in modo che tutti i tuoi modelli lo estendano anziché eloquente. Basta tenere presente che le tabelle pivot DEVONO avere i timestamp se si utilizza Eloquent.

Aggiornamento: si noti che i timestamp non sono più NECESSARI nelle tabelle pivot dopo Laravel v3.

Aggiornamento: è inoltre possibile disabilitare i timestamp rimuovendoli $table->timestamps()dalla migrazione.


1
Non so perché non ho mai pensato di fare un BaseModel e impostarlo lì. Funziona magnificamente. Solo una nota in base alle tabelle pivot della documentazione è necessaria solo se si imposta ora con Timestamps () (non so se è cambiato dalle versioni precedenti)
projectxmatt

Non ero a conoscenza del metodo withTimestamps (). Dovrò esaminarlo.
bgallagh3r,

@ bgallagh3r, c'è comunque da diasble solo per la query perticuler, diciamo per la visualizzazione di fontend non voglio il timestamp, ma per il backend voglio il timestamp. C'è un modo per farlo?
user7747472

10
Quando si rimuove $ table-> timestamps () dalla migrazione, eloquent li includerà comunque nella query. Questo porta ad un errore poiché il campo non esiste. Altrimenti ottima risposta.
Thijs Steel,

115

Posiziona semplicemente questa linea nel tuo modello :

public $timestamps = false;

E questo è tutto!


Esempio:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    public $timestamps = false;

    //
}

Per disabilitare i timestamp per un'operazione (ad es. In un controller):

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

Per disabilitare i timestamp per tutti i tuoi modelli , crea un nuovo BaseModelfile:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class BaseModel extends Model
{
    public $timestamps = false;

    //
}

Quindi estendi ciascuno dei tuoi modelli con BaseModel, in questo modo:

<?php

namespace App;

class Post extends BaseModel
{
    //
}

22

Se devi solo disabilitare l'aggiornamento aggiornato_at semplicemente aggiungi questo metodo al tuo modello.

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

Ciò sovrascriverà il metodo genitore setUpdatedAtAttribute (). Created_at funzionerà come al solito. Allo stesso modo è possibile scrivere un metodo per disabilitare l'aggiornamento creato_at solo.


2
Questo ha funzionato per me perché l'impostazione di $ timestamps = false ha causato il metodo create_at-> diffForHumans () di smettere di funzionare poiché non è più un'istanza carbon.
Nivin,

Funziona per me, questo metodo disabilita semplicemente il campo updated_at di cui ho bisogno, grazie
Radames E. Hernandez,

22

Se si utilizza 5.5.x:

const UPDATED_AT = null;

E per il campo "Created_at", puoi utilizzare:

const CREATED_AT = null;

Assicurati di essere sulla versione più recente. (Questo è stato rotto in Laravel 5.5.0 e risolto di nuovo in 5.5.5).


11

Modello eloquente:

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

    public $timestamps = false;
}

O semplicemente prova questo

$users = new Users();
$users->timestamps = false;
$users->name = 'John Doe';
$users->email = 'johndoe@example.com';
$users->save();

9

Nel caso in cui si desideri rimuovere i timestamp dal modello esistente, come accennato in precedenza, inserirlo nel modello:

public $timestamps = false;

Creare anche una migrazione con il seguente codice nel up()metodo ed eseguirlo:

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

È possibile utilizzare $table->timestamps()nel down()metodo per consentire il rollback.


1
Questa dovrebbe essere la risposta migliore. Se si dispone di un database di produzione esistente, è necessario eseguire una migrazione e disabilitare i timestamp sul modello.
Brad

7

basta dichiarare la publicvariabile di timestamp nel vostro Modelper falsee tutto sarà grande lavoro.

public $timestamps = false;


5

Aggiungi questa linea al tuo modello:

Sovrascrivi la variabile esistente da $timestamps vera a falsa

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

public $timestamps = false;

1

Sostituisci le funzioni setUpdatedAt()e getUpdatedAtColumn()nel tuo modello

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

public function getUpdatedAtColumn()
{
    //Do-nothing
}

20
Un caso di "funziona, ma nessuno nella loro mente giusta lo farebbe davvero"
Developerbmw

1

È possibile disabilitare temporaneamente i timestamp

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

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

$user->timestamps=$timestamps;   // restore timestamps
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.