Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment créer une colonne virtuelle complexe dans un modèle éloquent ?

Solution 1 :Utiliser une étendue globale pour ajouter le champ à vos instructions de sélection

Le seul problème avec les colonnes virtuelles est qu'Eloquent essaiera de les mettre à jour si vous ne l'en empêchez pas. Vous pouvez l'exclure du tableau $fillable et utiliser une portée globale dans votre modèle pour ajouter la colonne virtuelle, quelque chose comme :

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

Vous devrez garder à l'esprit que cela couplera votre modèle à MySQL puisque les fonctions de date que vous utilisez ne fonctionneront pas dans des bases de données comme sqlite.

Solution 2 :Utiliser une vue MySQL

Normalement, ce que je fais lorsque j'ai plusieurs champs calculés, c'est créer une vue MySQL. Créez la vue avec tous les champs calculés que vous voulez, puis vous pouvez créer un nouveau modèle Eloquent pour cette vue sans avoir à vous soucier des étendues de requête.

La seule mise en garde est que vous ne pouvez bien sûr pas utiliser créer/mettre à jour/supprimer sur ce modèle, mais si vous n'utilisez le modèle qu'à des fins d'affichage, cela ne devrait pas poser de problème.