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!
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ť