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...

Poptat web

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.