Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie erstelle ich eine komplexe virtuelle Spalte in einem Eloquent Model?

Lösung 1:Verwenden eines globalen Gültigkeitsbereichs zum Hinzufügen des Felds zu Ihren Auswahlanweisungen

Das einzige Problem mit virtuellen Spalten ist, dass Eloquent versucht, sie zu aktualisieren, wenn Sie es nicht verhindern. Sie können es aus dem $fillable-Array ausschließen und einen globalen Geltungsbereich verwenden in Ihrem Modell, um die virtuelle Spalte hinzuzufügen, etwa so:

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

Sie müssen bedenken, dass dies Ihr Modell mit MySQL koppelt, da die von Ihnen verwendeten Datumsfunktionen in Datenbanken wie sqlite nicht funktionieren.

Lösung 2:Verwenden einer MySQL-Ansicht

Wenn ich mehrere berechnete Felder habe, erstelle ich normalerweise eine MySQL-Ansicht. Erstellen Sie die Ansicht mit allen gewünschten berechneten Feldern, dann können Sie ein neues Eloquent-Modell für diese Ansicht erstellen, ohne sich um Abfragebereiche kümmern zu müssen.

Die einzige Einschränkung ist, dass Sie bei diesem Modell natürlich nicht create/update/delete verwenden können, aber wenn Sie das Modell nur zu Anzeigezwecken verwenden, sollte das kein Problem sein.