Eloquent ORM: Vytvoření záznamu souvisejícího modelu – metody save() a create()

Příklad: Přidání komentáře (comment) ke článku (post)

Rozdíl mezi metodami save() a create()

Metoda save() očekává jako vstupní parametr objekt modelu Eloquentu.
Metoda create() očekává jako vstupní parametr pole. Metoda sama vytvoří z dat v poli objekt modelu Eloquentu a poté jej uloží.

Metoda save()

1. Vytvoříme nový objekt komentáře a naplníme jej daty:

$comment = new App\Comment([
    'title' => 'Nadpis nového komentáře',
    'message' => 'Zpráva nového komentáře',
]);

2. Získáme objekt článku, ke kterému chceme komentář vložit:

$post = App\Post::find(1);

3. Nově vytvořený komentář k článku uložíme pomocí metody save():

$post->comments()->save($comment);

Upozornění: nevoláme dynamickou vlastnost comments (která vrací objekt Illuminate\Database\Eloquent\Collection) třídy Post ale její metodu comments(), která vrací instanci vazby (Illuminate\Database\Eloquent\Relations\HasMany).

Metoda save() automaticky zadá správnou hodnotu cizího klíče post_id objektu Comment.

Vložení více záznamů najednou – metoda saveMany()

Stejným způsobem lze přidat více záznamů najednou. Místo metody save() voláme metodu saveMany(), které předáme pole obsahující objekty modelu komentářů:

$post->comments()->saveMany([
    new App\Comment([
        'title' => 'Nadpis prvního nového komentáře',
        'message' => 'Zpráva prvního nového komentáře',
    ]),
    new App\Comment([
        'title' => 'Nadpis druhého nového komentáře',
        'message' => 'Zpráva druhého nového komentáře',
    ]),
]);

Metoda create()

Metoda create() očekává jako vstupní parametr pole.
Metoda vytvoří objekt modelu a uloží jej do databáze.

1. Vytvoříme pole s daty pro nový komentář:

$comment_array = [
    'title' => 'Nadpis nového komentáře',
    'message' => 'Zpráva nového komentáře',
];

2. Získáme objekt článku, ke kterému chceme komentář vložit:

$post = App\Post::find(1);

3. Data komentáře uložíme k článku pomocí metody create():

$comment = $post->comments()->create($comment_array);

Vložení více záznamů najednou – metoda createMany()

$post = App\Post::find(1);

$post->comments()->createMany([
    [
        'title' => 'Nadpis prvního nového komentáře',
        'message' => 'Zpráva prvního nového komentáře',
    ],
    [
        'title' => 'Nadpis druhého nového komentáře',
        'message' => 'Zpráva druhého nového komentáře',
    ],
]);

Zásadní výhodou všech uvedených funkcí: save(), create()saveMany() a createMany() je skutečnost, že není třeba manuálně zadávat cizí klíče pro propojení vazby a nemůže se tak stát, že např. v uvedeném případě omylem přidáme komentář k jinému článku, než bychom chtěli.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *