Posted on: November 03, 2020 08:52 PM
Posted by: Renato
Categories: Laravel
Views: 6358
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:00
. De Laravel 7, datas serializada usando o novo formato vai aparecer como: 2019-12-02T20:01:00.283041Z
. Se 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/
Donate to Site
Renato
Developer