Hydratácia - "oživovanie" polí

xvital
napísal @xvital (372), pred 4 mesiacmi, posledná úprava 21.8.2019 11:24

Je pravdepodobné, že s nasledovnou situáciou ste sa už stretli. Chcete vybrať dáta z databázy pokročilejším dotazom, no výber sa snažíte krkolomne napasovať na možnosti Eloquentu len preto, aby sa vám dáta vrátili ako kolekcia objektov a vy ste na nich mohli ďalej aplikovať fancy features, ktoré Eloquent ponúka.

To však nie je vôbec nutné. Napríklad jednoduchý MATCH AGAINST nad fulltextovým indexom za vás Eloquent pripraviť nedokáže.

$dry_posts = DB::table('posts')
   ->selectRaw('*, MATCH (title) AGAINST (?) AS reltitle, MATCH (excerpt) AGAINST (?) AS relexcerpt', [$query, $query])
   ->whereRaw('MATCH (title, excerpt) AGAINST (?)', [$query])
   ->orderByRaw('(reltitle * 1.3)+(relexcerpt) DESC')
   ->take(5)
   ->get();

Výsledkom takého raw selectu je kolekcia obsahujúca pole výsledkov, vrátených databázou. Položky poľa obsahujú všetky dáta jednotlivých záznamov, ale je to pole. Žiadne pekné metódy si na jednotlivé položky poľa nezavoláte.

Ak však vrátené pole hydratujete:

$posts = Post::hydrate($dry_posts->toArray());

// $posts->each(function ($post)) {
//    echo $post->comments()->first();
// }

Výsledkom bude kolekcia Eloquent objektov a môžete s nimi ďalej pracovať úplne rovnako, ako keby ste ich dostali z Post::where(...)->get().

Poznámka: Nezabudnite, že metóda hydrate príjma v argumente pole!

Ešte nie si členom CZ/SK Laravel komunity?

To možeš ľahko zmeniť. Registrácia je zdarma a ako registrovaný člen získaš množstvo výhod. Prečítaj si prečo by si mal byť členom.

Prihlásiť sa Zaregistrovať

Mohlo by Ťa zaujímať: