Mysql
 sql >> Database >  >> RDS >> Mysql

Come creare una colonna virtuale complessa in un modello eloquente?

Soluzione 1:utilizzo di un ambito globale per aggiungere il campo alle istruzioni selezionate

L'unico problema con le colonne virtuali è che Eloquent proverà ad aggiornarle se non lo previeni. Puoi escluderlo dall'array $fillable e utilizzare un ambito globale nel tuo modello per aggiungere la colonna virtuale, qualcosa come:

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'));
    });
}

Dovrai tenere presente che questo accoppierà il tuo modello a MySQL poiché le funzioni di data che stai utilizzando non funzioneranno in database come sqlite.

Soluzione 2:utilizzo di una vista MySQL

Normalmente quello che faccio quando ho più campi calcolati è creare una vista MySQL. Crea la vista con tutti i campi calcolati che desideri, quindi puoi creare un nuovo modello eloquente per quella vista senza doversi preoccupare degli ambiti delle query.

L'unico avvertimento è che ovviamente non puoi usare crea/aggiorna/elimina su questo modello, ma se stai usando il modello solo per scopi di visualizzazione, non dovrebbe essere un problema.