Vazby v Eloquentu: 1:1 a 1:n
V této sérii článků se budu věnovat databázovým vazbám v Laravelu, respektive v Eloquentu. Jako první se zaměříme na dvě nejjednodušší vazby, 1:1 (one to one) a 1:n (one to many). Vše si vysvětlíme na konkrétním případě s definicí vazby v modelu, s migracemi, vytahování dat a jejich ukládání.
Jako první si vytvoříme tabulku persons, kde primárním klíčem je sloupce id . Dále si vytvoříme tabulku passports , která také obsahuje sloupec id , ale co je nejdůležitější na této migraci je definice sloupce person_id a vytvoření cizího klíče, který odkazuje na sloupec id v tabulce persons . Tato migrace však pouze vytvoří vazbu v databázi, ale Laravel s ní stále nedokáže nijak pracovat ani ji využívat. Toho docílíme definováním požadované vazby v modelech.
Jako první parametr je název modelu, pro který chceme použít vazbu. Eloquent určuje cizí klíč na základě názvu modelu. V tomto případě se předpokládá, že model Passport má automaticky cizí klíč person_id . Pokud by jste chtěli přepsat tuto konvenci, pak je potřeba ho vložit do metody hasOne jako druhý parametr:
Dále Eloquent předpokládá, že cizí klíč odkazuje na sloupec id (nebo na vlastní $primaryKey ) v rodičovské tabulce. Jinak řečeno se Eloquent podívá na id osoby, na nějž person_id odkazuje v tabulce Passport . Pokud bychom chtěli pro vazbu použít jiný sloupec než id , pak ho můžeme specifikovat jako třetí argument:
Pokud ukládáme (nebo editujeme) model, který jsme definovali jako belongsTo , pak můžeme použít metodu associate() . Tato metoda nastaví cizí klíč na model dítěte (ve vztahu rodič-dítě):
Pro definici vazby 1:n jsme použili metodu hasMany na rodičovskou tabulku. Opět zde funguje stejná konvence, tedy že se předpokládá, že primární klíč v rodičovské tabulce bude sloupec id a cizí klíč bude vycházet z názvu modelu, tedy author_id . Pokud bychom chtěli konvenci změnit, pak je potřeba přidat druhý (vlastní cizí klíč), případně třetí parametr (vlastní primární klíč).
V případě, kdy vazba může mít více záznamů, je běžnou praxí psát název vazby v množném čísle, v tomto případě posts . Naopak pokud má záznam vždy pouze jednoho rodiče, pak se název vazby píše v jednotném čísle - author .
V dalším díle se více podíváme na vazbu n:n (many to many) a také na Eloquent specifickou vazbu "has many through".
Není vám něco jasné nebo mám někde chybu? Napište do komentářů pod článkem.