Laravel je dokonalý až moc - příklad:

Příklad, jak sofistikovanost Laravelu může někdy i škodit. Naštěstí takové případy často nenastávají. Toto je jediný snad za pět let. V podstatě pěju na Laravel pouze chválu.

Příklad je následující: Laravel ještě ve verzi 6, 7 a dalších (podle dotazů na fórech i v 9) a teď se podržte: Neumí zformulovat několikanásobný dotaz na databázi pomocí několika funkcí (metod) Where. Multiple where prostě nelze, naráží na objektovou kostru Laravelu. V holém PHP by to šlo bez omezení, ve skriptovacích jazycích v linuxu také. Je to jeden z mála příkladů, kdy přílišná sofistikovanost frameworku je na škodu oproti bazálnímu jazyku (zde PHP).

První způsob

Toto ač v PHP úplně logické a samozřejmé, v Laravelu prostě nelze:

CONTMO::select('CATnazevID')

->where('SLUG', '=', $DBO->SLUG)

->where('parent', 'SVYC')

->where(['ATTR', '<>', 'nft'])

->take(6)

->get();

Tři dotazy najednou pomocí metod Where() prostě Laravel odkecá a musí se na to složitě, mnohem složitěji, než klasickým PHP.

Oficiální postup by zněl: Nedotazovat mnohokrát where() na databázi a využít všechny předprogramované konstrukty dotazů na DB, které Laravel má, tedy rozředit dotazy do metod where(), orwhere(), whereRaw / orWhereRaw, whereNotIn(), selectRaw(), having(), havingRaw / orHavingRaw, Raw(), On(), whereNull() a podobně. Každý z dotazů strčit do jedné této funkce. Jenže ona má každá svoje vlastní specifika, např. vyžaduje použití nutných podmíněných příkazů, které se sem buď nehodí nebo spolu navzájem kolidují.

Druhý způsob

Druhá oficiální cesta pomocí pole o více příkazech where také nefunguje. Pole funkcí podmínek (array of conditions):

DB::table('users')->where([

    ['status', '=', '1'],

    ['subscribed', '<>', '1'],

    ['něco', '!=', 'něčemu']

    ])->get();

Nefunguje, Laravel tím prostě nedokáže zformulovat jednotný dotaz na databázi. Ač je to cesta oficiálně nabízená na laracasts.com, minimálně v Laravelu 6 a 7 rovněž nelze použít. Pravděpodobně bude fungovat v Laravelu 9 a novějších, když ji zde autoři nabízejí.

Třetí způsob

Třetí nabízící se způsob rozhodně funguje, vymysleli ho koumáci na stackoverflow.com, ale je to doslova lidová ochcávačka objektových způsobů Laravelu, řešení určitě fungující i v L6, ale tak pekelně krkolomné:

CONTMO::select('id', 'TEX1nadpis', 'TEX2intro', 'SLUG', 'IMGintro', 'TYP')

->where('parent', 'SVYC')

->where(function ($query) use ($CATnazevID) {

   $query->where('parent', $CATnazevID);

       }) //vnořené where

        ->whereIn('TYP', ['artic', 'articmulti']) //rozřeďuju kritéria

          ->orderBy('id', 'desc')

          ->paginate(10);

Jak je vidět, řešení využívá pojmu closure(), tedy další vnořené funkce, konkrétně další where() vnořené jako argument prvního where(). Člověk tomu prakticky nerozumí jak to funguje, ale ví se, že to funguje. Příkladem je možné vnořit dvě where() do sebe. Jak by vypadaly vnořené tři v sobě, by člověku dalo pořádně zamyslet.

Přitom další metody whereIn(), orderBy() a paginate() již volně zřetězit lze, naprosto bez problémů.

Čtvrtý způsob

No a vítězem je ještě čtvrtý způsob, jak použít více →where(), který jsem také našel na stackoverflow.com (co bychom bez něj dělali), který je vysloveně neelegantní a dal by se označit za hloupou sprostou lidovou prasárnu, ale prostě funguje. A sice předefinovat stejnou proměnnou v kaskádě více upřesňujících dotazů where() tak, že ani jednou v proměnné nejsou dvě where() za sebou ani v sobě:

$CATblogdata = CONTMO::orderBy('id', 'desc')

                    ->select('id', 'TEX1nadpis', 'TEX2intro', 'SLUG', 'IMGintro', 'TYP', 'ATTR')

                    ->whereIn('TYP', ['artic', 'articmulti']); //poprvé

$CATblogdata = $CATblogdata->where('parent', '=', $DBO->CATnazevID) //podruhé

$CATblogdata = $CATblogdata->where('ATTR', '<>', 'nft') //potřetí

                    ->paginate(6);

Tedy třikrát nadefinovaná a znovupoužitá proměnná. V holém PHP to je koncepce naprosto běžná a hojně používaná, dokonce považována za elegantní. V Laravelu naparujícím se objektovou kostrou dotazů na databázi a množstvím dotazovacích funkcí, které lze (jak vidno nikoli volně) zřetězit, je to považováno za blbárnu, která řeže do očí.

Přesto Laravel vládne

Takže toť jediná výtka Laravelu ve prospěch holého PHP, jinak je Laravel naprosto boží a doufám, že ovládne celý trh práce s PHP, přesněji řečeno doufám, že snad časem zmasakruje ryze český extrabuřt, brněnský počin Nette, který používají výhradně Češi a shodou náhod pouze moravané z Brna a jinak ve světě to nikdo nezná. 

Je to podobný český extrabuřt jako seznam.cz nebo množství českých (moravských) antivirových programů. Celý svět používá jednotné řešení (nebo dvě, tři), jen češi musí mít svoje extrabuřty.

Takže i přes tuto výtku, ať žije Laravel!

DC home |
Portál vojenských technologií |
Ostatní články |
Organizační

Mahal je jen jeden z mnoha Tádžů, stejně jako Angkor je jen jeden z mnoha Watů.
DigCest