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.