sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo crear una columna virtual compleja en un Modelo Elocuente?

Solución 1:usar un alcance global para agregar el campo a sus declaraciones seleccionadas

El único problema con las columnas virtuales es que Eloquent intentará actualizarlas si no lo impide. Puede excluirlo de la matriz $fillable y usar un alcance global en su modelo para agregar la columna virtual, algo como:

protected static function boot()
{
    parent::boot();

    static::addGlobalScope('next_action', function (Builder $builder) {
        $builder->addSelect(DB::raw('DATE_ADD(updated_at, INTERVAL days DAY) AS next_action'));
    });
}

Deberá tener en cuenta que esto acoplará su Modelo a MySQL ya que las funciones de fecha que está utilizando no funcionarán en bases de datos como sqlite.

Solución 2:usar una vista de MySQL

Normalmente, lo que hago cuando tengo varios campos calculados es crear una vista MySQL. Cree la vista con todos los campos calculados que desee, luego puede crear un nuevo modelo Eloquent para esa vista sin tener que preocuparse por los alcances de las consultas.

La única advertencia es que, por supuesto, no puede usar crear/actualizar/eliminar en este modelo, pero si solo está usando el modelo con fines de visualización, eso no debería ser un problema.