sql >> Database >  >> RDS >> Mysql

Hoe maak je een complexe virtuele kolom in een Eloquent Model?

Oplossing 1:een globaal bereik gebruiken om het veld toe te voegen aan uw geselecteerde uitspraken

Het enige probleem met virtuele kolommen is dat Eloquent zal proberen ze bij te werken als je dit niet verhindert. Je kunt het uitsluiten van de $fillable array en een global scope gebruiken in uw model om de virtuele kolom toe te voegen, zoiets als:

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

U moet er rekening mee houden dat hierdoor uw model aan MySQL wordt gekoppeld, aangezien de datumfuncties die u gebruikt niet werken in databases zoals sqlite.

Oplossing 2:een MySQL-weergave gebruiken

Wat ik normaal gesproken doe als ik meerdere berekende velden heb, is een MySQL-weergave maken. Maak de weergave met alle berekende velden die u wilt, dan kunt u een nieuw welsprekend model voor die weergave maken zonder dat u zich zorgen hoeft te maken over querybereiken.

Het enige voorbehoud is dat u maken/bijwerken/verwijderen op dit model natuurlijk niet kunt gebruiken, maar als u het model alleen voor weergavedoeleinden gebruikt, zou dat geen probleem moeten zijn.




  1. InnoDB of MyISAM - Waarom niet allebei?

  2. Een opgeslagen procedure aanroepen binnen een opgeslagen procedure

  3. Karaktergegevens gaan niet van php naar jQuery

  4. Staat MySQL callbacks in C toe zodat ik een melding krijg als er een wijziging plaatsvindt?