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?

projectxmatt
fonte

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.

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

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

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

realplay
fonte
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;

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

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

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

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