Desativar os carimbos de data e hora eloquentes do Laravel


186

Estou no processo de converter um de nossos aplicativos da Web do CodeIgniter para o Laravel. No entanto, neste momento, não queremos adicionar os campos updated_at/ created_ata todas as nossas tabelas, pois temos uma classe de log que já faz tudo isso com mais profundidade.

Estou ciente de que posso definir $timestamps = false;:

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

No entanto, prefiro não alterar um arquivo principal para o Laravel ou fazer com que todos os meus modelos o tenham no topo. Existe alguma maneira de desativar isso em outro lugar para todos os modelos?

Respostas:


360

Você precisa declarar public $timestamps = false;em todos os modelos ou criar um BaseModel, defini-lo lá e ter todos os seus modelos estendidos em vez de eloquentes. Basta ter em mente que as tabelas dinâmicas DEVEM ter registros de data e hora se você estiver usando o Eloquent.

Atualização: observe que os carimbos de data e hora não são mais NECESSÁRIOS nas tabelas dinâmicas após o Laravel v3.

Atualização: você também pode desativar os carimbos de data / hora removendo $table->timestamps()da sua migração.


1
Não sei por que nunca pensei em fazer um BaseModel e defini-lo lá. Funciona lindamente. Apenas uma nota de acordo com a documentação tabelas dinâmicas precisam apenas se definir withTimestamps () agora (não sei se isso mudou a partir de versões anteriores)
projectxmatt

Não conhecia o método withTimestamps (). Vou precisar investigar.
bgallagh3r

@ bgallagh3r, existe alguma maneira de alterar apenas para consulta do perticuler, digamos que para exibição de fonte não quero carimbo de data / hora, mas para back-end quero carimbo de data / hora. Existe alguma maneira de fazer isso?
user7747472

10
Ao remover $ table-> timestamps () da migração, o eloquent ainda os incluirá na consulta. Isso leva a um erro, pois o campo não existe. Caso contrário, ótima resposta.
Thijs Steel

115

Simplesmente coloque esta linha no seu modelo :

public $timestamps = false;

E é isso!


Exemplo:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    public $timestamps = false;

    //
}

Para desativar os carimbos de data / hora para uma operação (por exemplo, em um controlador):

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

Para desativar os carimbos de data e hora de todos os seus modelos , crie um novo BaseModelarquivo:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class BaseModel extends Model
{
    public $timestamps = false;

    //
}

Em seguida, estenda cada um de seus modelos com o seguinte BaseModel:

<?php

namespace App;

class Post extends BaseModel
{
    //
}

22

Se você precisar apenas desativar a atualização updated_at, adicione este método ao seu modelo.

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

Isso substituirá o método pai setUpdatedAtAttribute (). created_at funcionará normalmente. Da mesma maneira que você pode escrever um método para desativar a atualização created_at only.


2
Isso funcionou para mim porque definir $ timestamps = false fez com que o método created_at-> diffForHumans () parasse de funcionar, pois não é mais uma instância de carbono.
Nivin

Ele funciona para mim, este método apenas desativar o campo updated_at que eu preciso, graças
Radames E. Hernandez

22

Se você estiver usando o 5.5.x:

const UPDATED_AT = null;

E para o campo 'created_at', você pode usar:

const CREATED_AT = null;

Verifique se você está na versão mais recente. (Isso foi quebrado no Laravel 5.5.0 e corrigido novamente no 5.5.5).


11

Modelo eloquente:

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

    public $timestamps = false;
}

Ou simplesmente tente isso

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

9

Caso você queira remover os carimbos de data / hora do modelo existente, conforme mencionado anteriormente, coloque-o no seu Modelo:

public $timestamps = false;

Crie também uma migração com o seguinte código no up()método e execute-o:

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

Você pode usar $table->timestamps()no seu down()método para permitir a reversão.


1
Essa deve ser a melhor resposta. Se você já possui um banco de dados de produção, precisará executar uma migração e desativar os carimbos de data e hora no modelo.
22919 brad

7

basta declarar a publicvariável timestamps no seu Modelto falsee tudo funcionará bem.

public $timestamps = false;


5

Adicione esta linha ao seu modelo:

Substituir variável existente $timestamps true para false

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

public $timestamps = false;

1

Substituir as funções setUpdatedAt()e getUpdatedAtColumn()no seu modelo

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

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

20
Um caso de "funciona, mas ninguém em sã consciência faria isso" #
developerbmw

1

Você pode desativar temporariamente os carimbos de data e hora

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

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

$user->timestamps=$timestamps;   // restore timestamps
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.