Vysvětlení spojů Laravel: Přehledný průvodce s praktickými příklady

Zvládnutí spojů v Laravelu Spojování je výkonný nástroj v nástroji Laravel pro sestavování dotazů, který umožňuje kombinovat data z více databázových tabulek. Ať už sestavujete je...

Světlý režim slouží jen pro ukázku funkcionality. Proto používejte tmavou verzi webu.

25. 12. 2024

Vysvětlení spojů Laravel: Přehledný průvodce s praktickými příklady

Zvládnutí spojů v Laravelu

Spojování je výkonný nástroj v nástroji Laravel pro sestavování dotazů, který umožňuje kombinovat data z více databázových tabulek. Ať už sestavujete jednoduchý dotaz, nebo něco složitějšího, Laravel vám to usnadní. Tento průvodce vás seznámí se základy spojování, vysvětlí vám, kdy jednotlivé typy použít, a uvede přehledné příklady.

Co jsou to spoje?

Při práci s databázemi často potřebujete načíst data, která spolu souvisejí, ale jsou uložena v různých tabulkách. Například users může uchovávat údaje o uživateli, zatímco tabulka posts tabulka ukládá jejich příspěvky na blogu. Chcete-li tato data spojit do jednoho dotazu, použijte příkaz připojit se k.

Laravel nabízí několik typů spojů:

  1. Vnitřní spojení
  2. Spojení vlevo / vpravo
  3. Křížové spojení
  4. Pokročilé spoje
  5. Spojení poddotazů
  6. Boční spoje
  7. Odbory

Prozkoumejme každý z nich na příkladech.

1. Vnitřní spojení

An vnitřní spojení vrátí pouze řádky, které se shodují v obou tabulkách. V Laravelu můžete použít příkaz join metoda:

use Illuminate\Support\Facades\DB;
 
$users = DB::table('users')
->join('contacts', 'users.id', '=', 'contacts.user_id')
->join('orders', 'users.id', '=', 'orders.user_id')
->select('users.*', 'contacts.phone', 'orders.price')
->get();

Tento dotaz spojuje tři tabulky: users, contactsa orders. Získává údaje o uživatelích, telefonní čísla a ceny objednávek, pokud se údaje v tabulkách shodují.

2. Spojení vlevo a vpravo

A levý spoj vrátí všechny řádky z levé tabulky a odpovídající řádky z pravé tabulky. A pravé spojení dělá pravý opak. Zde je návod, jak to udělat v Laravelu:

Připojení vlevo:

$users = DB::table('users')
->leftJoin('posts', 'users.id', '=', 'posts.user_id')
->get();

Připojte se k pravé straně:

$users = DB::table('users')
->rightJoin('posts', 'users.id', '=', 'posts.user_id')
->get();

Použijte je, pokud chcete získat všechny řádky z jedné tabulky, i když v druhé není shoda.

3. Křížové spojení

A křížový spoj vytvoří kartézský součin, který kombinuje každý řádek první tabulky s každým řádkem druhé tabulky. Například:

$sizes = DB::table('sizes')
->crossJoin('colors')
->get();

Tento dotaz vygeneruje všechny možné kombinace velikostí a barev.

4. Pokročilé spojovací klauzule

Někdy potřebujete v kloubech složitější podmínky. K definování vlastních omezení použijte uzávěr:

Používání stránek orOn:

DB::table('users')
->join('contacts', function ($join) {
$join->on('users.id', '=', 'contacts.user_id')
->orOn('users.email', '=', 'contacts.email');
})
->get();

Používání stránek where a orWhere:

DB::table('users')
->join('contacts', function ($join) {
$join->on('users.id', '=', 'contacts.user_id')
->where('contacts.user_id', '>', 5)
->orWhere('contacts.is_active', true);
})
->get();

Tyto metody umožňují vytvářet podrobné podmínky, které zajistí, že získáte přesně ta data, která potřebujete.

5. Spojování poddotazů

Tabulku můžete spojit i s poddotazem pomocí příkazu joinSub metoda. Například:

$latestPosts = DB::table('posts')
->select('user_id', DB::raw('MAX(created_at) as last_post_created_at'))
->where('is_published', true)
->groupBy('user_id');
 
$users = DB::table('users')
->joinSub($latestPosts, 'latest_posts', function ($join) {
$join->on('users.id', '=', 'latest_posts.user_id');
})
->get();

Tím se načtou uživatelé spolu s časovým razítkem jejich posledního zveřejněného příspěvku.

6. Boční spoje

Boční spojení vyhodnotí poddotaz pro každý řádek hlavního dotazu. Podporují je PostgreSQL, MySQL >= 8.0.14 a SQL Server.

Například:

$latestPosts = DB::table('posts')
->select('id as post_id', 'title as post_title', 'created_at as post_created_at')
->whereColumn('user_id', 'users.id')
->orderBy('created_at', 'desc')
->limit(3);
 
$users = DB::table('users')
->joinLateral($latestPosts, 'latest_posts')
->get();

Tento dotaz načte každého uživatele spolu s jeho třemi posledními příspěvky. Každý řádek hlavního dotazu může ve spojeném dotazu přinést více výsledků.

7. Odbory

Někdy může být potřeba zkombinovat výsledky dvou dotazů. Použijte union metodu pro tento účel:

use Illuminate\Support\Facades\DB;
 
$first = DB::table('users')
->whereNull('first_name');
 
$users = DB::table('users')
->whereNull('last_name')
->union($first)
->get();

Pokud nechcete odstranit duplikáty, použijte příkaz unionAll místo toho:

$users = DB::table('users')
->whereNull('last_name')
->unionAll($first)
->get();

Souhrn

Spojení jsou nezbytná pro efektivní načítání souvisejících dat. Laravel poskytuje řadu metod pro řešení různých scénářů:

  • Vnitřní spojení: Shoduje se s řádky v obou tabulkách.
  • Spojení vlevo / vpravo: Zahrnuje neshodující se řádky z jedné tabulky.
  • Křížové spojení: Generuje všechny kombinace řádků ze dvou tabulek.
  • Pokročilé spoje: Umožňuje nastavit vlastní podmínky.
  • Spojení poddotazů: Spojení se složitými poddotazy.
  • Boční spoje: Dílčí dotazy, které závisí na každém řádku hlavního dotazu.
  • Odbory: Kombinuje výsledky z více dotazů.

Jejich zvládnutí vám pomůže zvládnout i ty nejsložitější datové vztahy v projektech Laravel. Šťastné kódování!

Původní článek publikoval Nabil Hassen.

Mohlo by vám pomoct

Praktické věci kolem webu

Než se pustíte do webu, hodí se mít jasno v podkladech, WordPressu, cookies a měření.

Google reference

Co říkají klienti

Ukázky skutečných recenzí, které klienti zanechali na mém Google profilu.

Přejít na recenze
★ ★ ★ ★ ★

„Člověk, který své práci a rozumí a ví co dělá. Velmi rychlá komunikace a profesionální přístup. Doporučuji.“

Jaroslav Kupča
Google
★ ★ ★ ★ ★

„Skvělá spolupráce, při dalších projektech určitě nebudu shánět někoho jiného.“

Roman Koňařík
Google
★ ★ ★ ★ ★

„S panem Vančurou jsem spolupracovala na tvorbě mých webových stránek a jsem maximálně spokojená. Oceňuji profesionální přístup, rychlou komunikaci a schopnost přesně pochopit moje představy. Web je moderní, přehledný, funkční a skvěle vypadá i na mobilu. Celý proces proběhl hladce, s jasným vysvětlením jednotlivých kroků a výborným výsledkem. Určitě doporučuji každému, kdo hledá spolehlivý a kvalitní přístup.“

Barbora Zemánková
Google
★ ★ ★ ★ ★

„Spolupráce při tvorbě konfigurátoru proběhla naprosto bez problémů. Oceňuji profesionální přístup, rychlou komunikaci a schopnost pochopit specifický projekt od A do Z. Konfigurátor je přehledný, funkční a přesně odpovídá mým požadavkům. Rozhodně doporučuji.“

mareksevcik_FPV
Google
★ ★ ★ ★ ★

„Velmi dobrá a rychlá spolupráce. Doporučuji!“

Leoš Kaucký
Google
★ ★ ★ ★ ★

„Přesně takto si představujeme profesionální práci. Dekujeme“

STAVILLI
Google
★ ★ ★ ★ ★

„Ať už se jedná o optimalizaci webu, nebo tvorbu na míru oceňuji kromě profesionální práce a znalostí problematiky také férový přístup a komunikaci.“

Aleš Illický
Google
★ ★ ★ ★ ★

„Děkuji za profesionální spolupráci, vše dle domluvy, naprostá spokojenost a mohu jen vřele doporučit.... Při dalších projektech určitě opět využiji Vašich služeb“

Peter Spilak
Google
★ ★ ★ ★ ★

„Profesionalita a velká ochota, nemohu jinak než doporučit“

Magdalena Vašková
Google
★ ★ ★ ★ ★

„Skvělá zkušenost při tvorbě webu, profesionální přístup, rychlost, ochota pomoci“

Jana Kono
Google
★ ★ ★ ★ ★

„Rychlá spolupráce a komunikace – mohu jen doporučit.“

Gawix
Google
★ ★ ★ ★ ★

„Moc mi pomohl, když jsem potřebovala pomoc s webem. A bylo to gratis :)). Jsem mu neskonale vděčná.“

Radka Arbesová
Google
★ ★ ★ ★ ★

„Děkuji Jiřímu za rychlou a kvalitní spolupráci na tvorbě webu. Srozumitelná a ochotná komunikace mě vždycky potěší a přináší důvěru.“

Jiří Mařík
Google
★ ★ ★ ★ ★

„Jsem maximálně spokojená. Rychlost, ochota a cenově dostupné. Děkuji“

Veronika Černá
Google
★ ★ ★ ★ ★

„Naprostá spokojenost. Rychlá komunikace, skvělá cena a odborná pomoc. Moc děkuji :)“

Patricie Kučerová
Google
★ ★ ★ ★ ★

„Velká spokojenost, rychlost a p. Vančura moc dobře ví co dělá. :)“

Ondřej Daniško
Google
★ ★ ★ ★ ★

„dobrá práce, rychlá odezva“

Zuzana Jírová
Google
★ ★ ★ ★ ★

„S programátory mám zkušeností hodně, ale tady musím opravdu pochválit. Pro mě a mé přátele vytvořil skvělý nástroj na evidenci sbírek a opravdu se to povedlo. Bylo to hotové rychle, kvalitně a za skvělou cenu. Komunikace funguje velmi rychle, což je super a ne úplně standard. Díky za super práci, za mě 100% spokojenost!“

Zdeněk
Google
★ ★ ★ ★ ★

„Vše bylo rychlé a hlavně to funguje. Dobrá práce.“

Lukáš Bartášek
Google
★ ★ ★ ★ ★

„Normálně recenze nepíši, ale zde rád doporučím kvalitní práci. Jiří pro mě vytvořil web pro dětské tábory. Kvalitní práce, rychlá komunikace a vlastní nápady, které Jiří sám přidá, jsou na velice vysoké úrovni. Nemohu hodnotit jinak než 5/5.“

Tomáš Loněk
Google
★ ★ ★ ★ ★

„Pan Jiri nam delal jiz 3 webove stranky a vzdy velka spokojenost, je mega rychly a vse hned kladne vyridi, mohu pouze doporucit. Poradi si bez problemu i s rezervacnimi kalendaremi, udrzbou socialnich siti, atd.“

Barbara Mašková
Google