Post Top Ad

Your Ad Spot

domingo, 4 de octubre de 2020

8 trucos con las marcas de tiempo de Laravel

 De forma predeterminada, los modelos de Laravel Eloquent asumen que su tabla tiene campos de marca de tiempo: created_at y updated_at. Pero hay muchas cosas que puede hacer para personalizarlos o realizar algunas operaciones interesantes. Vamos a ver.


1.Deshabilitar marcas de tiempo

Si su tabla de base de datos no tiene esos campos, e intentará hacer algo como Model :: create ($ arrayOfValues); - obtendrá un error de SQL. Laravel intentaría completar automáticamente created_at / updated_at y no los encontraría.

Para deshabilitar esas marcas de tiempo automáticas, en su Modelo Eloquent debe agregar una propiedad:

class Role extends Model
{
    public $timestamps = FALSE;

    // ... other model properties and methods
}

2. Cambiar los nombres de las columnas de la marca de tiempo

¿Qué sucede si está trabajando con una base de datos que no es de Laravel y sus columnas de marca de tiempo tienen un nombre diferente? Quizás, tienes create_time y update_time . Afortunadamente, también puede especificarlos en el modelo:

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

3. Cambiar el formato de fecha / hora de la marca de tiempo

Aquí, solo citaré la documentación oficial de Laravel:

Antes laravel 7, las fechas serían serializados en un formato como el siguiente:  2019-12-02 20:01:00De laravel 7, fechas serializan con el nuevo formato aparecerá como:  2019-12-02T20:01:00.283041ZSi necesita personalizar el formato de la marca de tiempo, establezca la  $dateFormat propiedad en su modelo. Esta propiedad determina cómo se almacenan los atributos de fecha en la base de datos, así como su formato cuando el modelo se serializa en una matriz o JSON:

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

4. Varios a varios: tabla dinámica con marcas de tiempo

Una pequeña excepción para la automatización de marcas de tiempo es cuando crea una tabla dinámica en relaciones de muchos a muchos , como la tabla role_user entre usuarios y tablas de roles .

En el modelo, definiría una relación como esta:

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

Y luego, cuando desee agregar un rol a un usuario, haría algo como esto:

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

De forma predeterminada, esas tablas dinámicas no contienen marcas de tiempo . Y Laravel no intenta completar created_at / updated_at en este caso.

Pero si desea guardar las marcas de tiempo automáticamente, debe agregarlas al archivo de migración y luego definir la relación usando -> withTimestamps ();

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

5. Ordenar por marca de tiempo con el último () y el más antiguo ()

Hay dos "atajos" para ordenar los datos por marcas de tiempo.

En lugar de:

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

Puedes hacerlo más rápido:

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

De forma predeterminada, latest () se ordenará por created_at .

Hay un método opuesto, el más antiguo () que ordenaría por created_at ascendente.

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

Además, puede especificar otra columna para ordenar. Por ejemplo, si desea utilizar updated_at , puede hacer esto:

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

6. Actualice sin tocar updated_at

Siempre que actualiza el registro de Eloquent, automáticamente guarda la marca de tiempo actual en la columna updated_at , y esa es una gran característica.

Pero a veces desea evitarlo, como si incrementara algún valor y no quisiera considerarlo como una "actualización de registro completo".

Luego, debe hacer lo mismo que el anterior: deshabilite las marcas de tiempo, pero solo por esa vez:

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

7. Toque y toque de los padres

Al contrario del último ejemplo, tal vez desee establecer un nuevo valor en SOLAMENTE la columna updated_at y no cambiar otros.

Entonces, en lugar de:

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

Puede utilizar un método más corto:

$user->touch();

Otro caso: a veces no solo desea establecer updated_at del modelo Eloquent actual, sino también su registro principal por relación.

Por ejemplo, si se actualizó algún comentario , entonces querrá considerar que el registro de la publicación también debe tener un nuevo updated_at .

Luego, debe definir modelos de "toques de padres" en el modelo Eloquent:

class Comment extends Model {

    protected $touches = ['post'];

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

}

8. Los campos de marca de tiempo se cargan automáticamente

Último consejo de "bonificación": más como un "recordatorio" porque debe saberlo.

De forma predeterminada, tanto created_at como updated_at son conversiones como $ fechas del modelo Eloquent, por lo que puede realizar operaciones de Carbon en ellos, sin convertir a una instancia de Carbon.

Por ejemplo:

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

No hay comentarios.:

Publicar un comentario

Dejanos tu comentario para seguir mejorando!

outbrain

Páginas