Nie wiem w jaki sposób chciałeś zrobić sprawdzenie tego po stronie bazy danych, ale można powiedzieć, że sama walidacja Laravela i tak działa na sprawdzaniu zawartości bazy. Dla przykładu reguła walidacyjna unique, którą należy zastosować w przypadku twojego problemu, sprawdza czy w danej tabeli istnieje dane pole w danej kolumnie.
Szczerze powiem, że trochę zaciekawiłeś mnie tym pytaniem (bo nigdy nie miałem okazji napisać podobnej funkcjonalności w Laravelu) i z racji, że miałem trochę czasu to napisałem małą aplikację demo, w której uwzględniłem możliwość jednorazowego oddania głosu na tę samą książkę przez tego samego użytkownika. Link do kodu całej aplikacji znajdziesz poniżej, natomiast jeśli nie interesuje cię sama aplikacja to żeby zaoszczędzić twój czas zdradzę, że użyłem rozbudowanej reguły unique:
Rule::unique('scores', 'user_id')->where(function ($query) {
return $query->where('book_id', $this->book_id);
})
czy juz na poziomie walidacji w kontrolerze
Nie wiem co dokładnie miałeś na myśli i jak walidujesz dane, ale moim zdaniem nie powinno się tego robić w kontrolerze. Istnieją do tego specjalne klasy Laravela o nazwie Form Request, które w swojej pełnej okazałości odpowiadają tylko i wyłącznie za operacje związane z walidacją, dzięki czemu controller staje się chudszy i bardziej czytelny, a sam kod całej aplikacji bardziej wyseparowany.
Link do aplikacji: GitHub
Aby zainstalować aplikację lokalnie należy:
- stworzyć plik .env w katalogu aplikacji i uzupełnić go treścią z pliku .env.example,
- uzupełnić dane do bazy danych w pliku .env,
- wygenerować klucz do aplikacji (php artisan key:generate),
- wygenerować bazę danych i ją zasiać (php artisan migrate --seed),
- pobrać książki do bazy danych z api (php artisan books:fetch).
Potem już wystarczy się zalogować do samej aplikacji, UserSeeder wygeneruje użytkownika o emailu cubestorm72@gmail.com z hasłem password.