Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como criar uma coluna virtual complexa em um modelo Eloquent?


Solução 1:usando um escopo global para adicionar o campo às suas instruções de seleção

O único problema com as colunas virtuais é que o Eloquent tentará atualizá-las se você não impedir. Você pode excluí-lo do array $fillable e usar um escopo global em seu modelo para adicionar a coluna 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'));
    });
}

Você deve ter em mente que isso acoplará seu modelo ao MySQL, pois as funções de data que você está usando não funcionarão em bancos de dados como o sqlite.

Solução 2:usando uma visualização do MySQL

Normalmente, o que faço quando tenho vários campos calculados é criar uma visualização do MySQL. Crie a visão com todos os campos calculados que você deseja, então você pode criar um novo modelo Eloquent para essa visão sem ter que se preocupar com escopos de consulta.

A única ressalva é que você obviamente não pode usar criar/atualizar/excluir neste modelo, mas se você estiver usando o modelo apenas para fins de exibição, isso não deve ser um problema.