Validácia unikátnych hodnôt

xvital
napísal @xvital (422), pred rokom, posledná úprava 18.10.2019 11:43

Pri prijímaní vstupu a následnom ukladaní hodnôt sa často stretneme s potrebou validovať unikátnosť hodnoty v rámci databázovej tabuľky. Laravel preto obsahuje jednoduché pravidlo unique, ktoré funguje nasledovne:

'code' => 'string|unique:vouchers'

V uvedenom príklade musí byť kód voucheru reťazec znakov a musí byť unikátny v rámci tabuľky vouchers.

Ak prijímate hodnotu pod iným kľúčom ako je názov stĺpca v tabuľke, môžete uviesť názov stĺpca explicitne:

'promo_code' => 'string|unique:vouchers,code'

Pri validácii sa teraz bude kontrolovať stĺpec code aj napriek tomu, že validujeme pole s názvom promo_code.

Toto je základné využitie unique, ktoré nájdete zdokumentované v oficiálnej dokumentácii. Okrem toho existujú aj menej zdokumentované, resp. nezdokumentované možnosti validácie, ktoré sa však môžu veľmi často hodiť.

Vynechanie riadku tabuľky z validácie

Často potrebujeme pri update operáciach vynechať z validácie riadok, ktorý upravujeme. Inými slovami, chceme povoliť prepísanie hodnoty ktorá už existuje rovnakou hodnotou, pokiaľ ide o rovnaký riadok tabuľky, ktorý upravujeme.

'code' => 'string|unique:vouchers,code,' . $voucher->id . ',id',

Tento zápis hovorí, že chceme aby bola hodnota code unikátna v rámci tabuľky vouchers v stĺpci code, ale výnimkou je riadok, ktorý ma id uvedeného vouchera. To znamená, že update rovnakou hodnotou prebehne bez validačnej chyby.

Validácia unikátnosti dvojice hodnôt

Častým prípadom je aj validácia unikátnosti dvojice hodnôt. Dva vouchery teda môžu mať rovnaký kód, ale nesmú sa viazať na rovnaký obchod.

'voucher' => [
   'string',
   Rule::unique('vouchers')->where(function ($query) {
      return $query->where('code', $this->voucher)
         ->where('store_id', $this->store_id);
   }),
]

V callback funkcii hľadáme v tabuľke dvojicu hodnôt code a _storeid. Validácia skončí chybou len vtedy, pokiaľ v tabuľke voucher takáto kombinácia hodnôt už existuje.

Ešte nie si členom CZ/SK Laravel komunity?

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ť

Mohlo by Ťa zaujímať:

xvital

Laravel 8

@xvital (422), pred 2 mesiacmi