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?

projectxmatt
fuente

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.

bgallagh3r
fuente
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
{
    //
}
PhilMarc
fuente
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.

Sampath Perera
fuente
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).

Sampath Perera
fuente
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 = '[email protected]';
$users->save();
srmilon
fuente
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.

juego real
fuente
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;

Shahrukh Anwar
fuente
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;
Jignesh Joisar
fuente
1

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

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

public function getUpdatedAtColumn()
{
    //Do-nothing
}
Krishan
fuente
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
Snapey
fuente