8 truques com timestamps do Laravel

Posted on: November 03, 2020 08:52 PM

Posted by: Renato

Categories: Laravel

Views: 60

Por padrão, os modelos do Laravel Eloquent assumem que sua tabela possui campos de carimbo de data/hora-created_at e updated_at. Mas há muitas coisas que você pode fazer para personalizá-los ou realizar algumas operações interessantes. Vamos dar uma olhada.


1. Desativar timestamps

Se sua tabela de banco de dados não tiver esses campos, você tentará fazer algo como Model :: create ($ arrayOfValues); - você obterá um erro de SQL. O Laravel tentaria preencher automaticamente created_at / updated_at e não os encontraria.

Para desativar esses carimbos de data / hora automáticos, em seu modelo do Eloquent você precisa adicionar uma propriedade:

class Role extends Model
{
    public $timestamps = FALSE;

    // ... other model properties and methods
}


 

2. Alterar os nomes das colunas do carimbo de data / hora

E se você estiver trabalhando com um banco de dados não-Laravel e suas colunas de timestamp tiverem nomes diferentes? Talvez você tenha create_time e update_time . Felizmente, você também pode especificá-los no modelo:

class Role extends Model
{
    const CREATED_AT = 'create_time';
    const UPDATED_AT = 'update_time'; 


3. Alterar o formato da data / hora do carimbo de data / hora

Aqui, vou apenas citar a documentação oficial do Laravel:

Antes Laravel 7, datas iria ser serializado para um formato como o seguinte:  2019-12-02 20:01:00De Laravel 7, datas serializada usando o novo formato vai aparecer como:  2019-12-02T20:01:00.283041ZSe você precisar personalizar o formato do carimbo de data / hora, defina a  $dateFormat propriedade em seu modelo. Esta propriedade determina como os atributos de data são armazenados no banco de dados, bem como seu formato quando o modelo é serializado para uma matriz ou JSON:

class Flight extends Model
{
    /**
     * The storage format of the model's date columns.
     *
     * @var string
     */
    protected $dateFormat = 'U';
}

4. Muitos para muitos: Tabela dinâmica com carimbos de data / hora

Uma pequena exceção para a automação de carimbos de data / hora é quando você cria uma tabela dinâmica em relacionamentos muitos para muitos , como a tabela role_user entre usuários e tabelas de funções .

No modelo, você definiria o relacionamento assim:

class User extends Model
{
    public function roles()
    {
        return $this->belongsToMany(Role::class);
    }
}

E então, quando você quiser adicionar uma função a um usuário, você faria algo assim:

$roleID = 1;
$user->roles()->attach($roleID);

Por padrão, essas tabelas dinâmicas não contêm carimbos de data / hora . E o Laravel não tenta preencher created_at / updated_at neste caso.

Mas se você deseja salvar os carimbos de data / hora automaticamente, você precisa adicioná-los ao arquivo de migração e, em seguida, definir o relacionamento usando -> withTimestamps ();

public function roles()
{
    return $this->belongsToMany(Role::class)->withTimestamps();
}

5. Peça por carimbo de data / hora com o mais recente () e o mais antigo ()

Existem dois “atalhos” para ordenar os dados por carimbos de data / hora.

Ao invés de:

User::orderBy('created_at', 'desc')->get();

Você pode fazer isso mais rápido:

User::latest()->get();

Por padrão, latest () ordenará por created_at .

Existe um método oposto mais antigo () que ordenaria por created_em ascendente.

User::oldest()->get();

Além disso, você pode especificar outra coluna para ordenar. Por exemplo, se você deseja usar updated_at , pode fazer o seguinte:

$lastUpdatedUser = User::newest('updated_at')->first();

6. Atualize sem tocar em updated_at

Sempre que você atualiza o registro do Eloquent, ele salva automaticamente o timestamp atual na coluna updated_at , e esse é um ótimo recurso.

Mas às vezes você quer evitá-lo, como incrementa algum valor e não quer considerá-lo como “atualização completa do registro”.

Em seguida, você precisa fazer o mesmo que acima - desative os carimbos de data / hora, mas apenas naquele momento:

$user = User::find(1);
$user->profile_views_count = 123;
$user->timestamps = false;
$user->save();

7. Toque e toque dos pais

Oposto do último exemplo - talvez você queira definir o novo valor para APENAS updated_at coluna, e não alterar os outros.

Então, em vez de:

$user->update(['updated_at' => now()]);

Você pode usar um método mais curto:

$user->touch();

Outro caso - às vezes você deseja não apenas definir updated_at do modelo atual do Eloquent, mas também seu registro pai por relacionamento.

Por exemplo, se algum comentário foi atualizado, então você deve considerar que o registro de postagem deve ter novo updated_at também.

Então, você precisa definir os modelos de “toques dos pais” no modelo do Eloquent:

class Comment extends Model {

    protected $touches = ['post'];

    public function post()
    {
        return $this->belongsTo('Post');
    }

}

8. Os campos de carimbo de data / hora são carbono automaticamente

Última dica de “bônus” - mais como um “lembrete” porque você deve saber sobre isso.

Por padrão, tanto created_at quanto updated_at são convertidos como $ datas do modelo Eloquent, então você pode realizar operações Carbon neles, sem converter para a instância Carbon.

Por exemplo:

$user->created_at->addDays(3);
now()->diffInDays($user->updated_at);

É isso, dicas rápidas, mas espero que úteis!

Fontes:

- https://laravel.com/docs/master/eloquent-mutators#date-mutators

- https://laraveldaily.com/8-tricks-with-laravel-timestamps/

 

Share
About Author

Renato

Developer

Add a Comment
Comments 0 Comments

No comments yet! Be the first to comment