Desactiva las marcas de tiempo elocuentes de Laravel


186

Estoy en el proceso de convertir una de nuestras aplicaciones web de CodeIgniter a Laravel. Sin embargo, en este momento no queremos agregar los campos updated_at/ created_ata todas nuestras tablas, ya que tenemos una clase de registro que ya hace todo esto con más profundidad para nosotros.

Soy consciente de que puedo configurar $timestamps = false;:

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

Sin embargo, prefiero no cambiar un archivo central para Laravel, o que todos mis modelos tengan eso en la parte superior. ¿Hay alguna forma de desactivar esto en otro lugar para todos los modelos?

Respuestas:


360

public $timestamps = false;Debe declarar en cada modelo o crear un Modelo base, definirlo allí y hacer que todos sus modelos lo extiendan en lugar de ser elocuentes. Simplemente tenga en cuenta que las tablas dinámicas DEBEN tener marcas de tiempo si está usando Eloquent.

Actualización: tenga en cuenta que las marcas de tiempo ya no son REQUERIDAS en las tablas dinámicas después de Laravel v3.

Actualización: también puede deshabilitar las marcas de tiempo quitándolas $table->timestamps()de su migración.


1
No sé por qué nunca pensé en hacer un Modelo base y configurarlo allí. Funciona muy bien Solo una nota de acuerdo con la documentación Las tablas dinámicas solo lo necesitan si se configura con TimeTamps () ahora (no sé si esto cambió desde versiones anteriores)
projectxmatt

No conocía el método withTimestamps (). Tendré que investigarlo.
bgallagh3r

@ bgallagh3r, ¿hay alguna forma de deshabilitarlo solo para la consulta pertinente? ¿Hay alguna manera de hacerlo?
user7747472

10
Al eliminar $ table-> timestamps () de la migración, elocuente aún los incluirá en la consulta. Esto lleva a un error ya que el campo no existe. De lo contrario, gran respuesta.
Thijs Steel el

115

Simplemente coloque esta línea en su modelo :

public $timestamps = false;

¡Y eso es!


Ejemplo:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    public $timestamps = false;

    //
}

Para deshabilitar las marcas de tiempo para una operación (por ejemplo, en un controlador):

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

Para deshabilitar las marcas de tiempo de todos sus modelos , cree un nuevo BaseModelarchivo:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class BaseModel extends Model
{
    public $timestamps = false;

    //
}

Luego extienda cada uno de sus Modelos con BaseModel, de esta manera:

<?php

namespace App;

class Post extends BaseModel
{
    //
}

22

Si solo necesita deshabilitar la actualización updated_at simplemente agregue este método a su modelo.

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

Esto anulará el método primario setUpdatedAtAttribute (). created_at funcionará como siempre. De la misma manera, puede escribir un método para deshabilitar la actualización created_at solamente.


2
Esto funcionó para mí porque establecer $ timestamps = false causó que el método created_at-> diffForHumans () dejara de funcionar ya que ya no es una instancia de carbono.
Nivin

A mí me funciona, este método simplemente deshabilita el campo updated_at que necesito, gracias
Radames E. Hernandez

22

Si está utilizando 5.5.x:

const UPDATED_AT = null;

Y para el campo 'created_at', puede usar:

const CREATED_AT = null;

Asegúrate de estar en la versión más nueva. (Esto se rompió en Laravel 5.5.0 y se corrigió nuevamente en 5.5.5).


11

Modelo elocuente:

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

    public $timestamps = false;
}

O simplemente prueba esto

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

9

En caso de que desee eliminar las marcas de tiempo del modelo existente, como se mencionó anteriormente, colóquelo en su Modelo:

public $timestamps = false;

También cree una migración con el siguiente código en el up()método y ejecútelo:

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

Puede usar $table->timestamps()su down()método para permitir el retroceso.


1
Esta debería ser la mejor respuesta. Si tiene una base de datos de producción existente, necesitará ejecutar una migración, así como deshabilitar las marcas de tiempo en el modelo.
Brad

7

simplemente declare la publicvariable de marcas de tiempo en su Modelto falsey todo funcionará muy bien.

public $timestamps = false;


5

Agregue esta línea a su modelo:

Sobrescribir la variable existente de $timestamps verdadero a falso

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

public $timestamps = false;

1

Anular las funciones setUpdatedAt()y getUpdatedAtColumn()en su modelo

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

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

20
Un caso de "funciona, pero nadie en su sano juicio podría realmente hacer esto"
developerbmw

1

Puede deshabilitar temporalmente las marcas de tiempo

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

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

$user->timestamps=$timestamps;   // restore timestamps
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.