• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Struktura bazy danych / modele. Laravel

Object Storage Arubacloud
+1 głos
341 wizyt
pytanie zadane 8 stycznia 2022 w SQL, bazy danych przez imagim Obywatel (1,130 p.)
Hej, mam chyba jakaś niemoc twórczą i nie mogę wymyślić jaka strukturę bazy danych i relacji modeli zastosować dla prostego systemu ocen. Zeby uprosicic problem to powiedzmy ze mam model User / Book / Score aktualnie, chce zeby kazda ksiazka mogla dostac jedna ocene od jedego Uzytkownika. Aktualnie mam tak ze klasa Score ma belongsTo User i BelongsTo to Book no i klasa Book ma hasMany scores. Tylko ze to nie eliminuje problemu zeby 1 user mogl 1 ksiazke ocenic tylko raz. Jaka powinna byc odpowiednia relacja / struktura bazy zeby to zrobic?

2 odpowiedzi

+1 głos
odpowiedź 8 stycznia 2022 przez CubeStorm Pasjonat (15,020 p.)
wybrane 9 stycznia 2022 przez imagim
 
Najlepsza

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.

komentarz 9 stycznia 2022 przez imagim Obywatel (1,130 p.)
Dzieki, po długich poszukiwaniach na stacku znalazłem zdaje sie podobne rozwiazanie :).

https://stackoverflow.com/questions/59376944/laravel-eloquent-relationship-hasmany-but-also-hasone
+1 głos
odpowiedź 8 stycznia 2022 przez SzkolnyAdmin Szeryf (86,360 p.)
Czy sprawdzanie, ze user już ocenił książkę musi być po stronie bazy danych czy może być programowe?

Jeżeli koniecznie w bazie danych, pomyśl nad kluczem głównym tabeli Score złożonym z dwóch pól: id usera i id książki.
komentarz 8 stycznia 2022 przez imagim Obywatel (1,130 p.)
No wlasnie nie mam pojecia, czy to powinno byc bezposrednio ogarniete przez sama strukture i relacje czy juz na poziomie walidacji w kontrolerze :), chce sie dowiedziec od madrzejszych.
komentarz 8 stycznia 2022 przez SzkolnyAdmin Szeryf (86,360 p.)
Oba sposoby są do zastosowanie, kwestia wyboru/warunków zadania. Najlepiej zrób oba projekty i porównaj.
komentarz 8 stycznia 2022 przez Wiciorny Ekspert (270,170 p.)

Czy sprawdzanie, ze user już ocenił książkę musi być po stronie bazy danych czy może być programowe?
 

Że co? Jak jest w bazie, to nie jest programowe? Wysłanie żądania o informacje - ze statusem zwrotnym nie jest programowalne? :) bo nie rozumiem trochę tej idei co miałeś na myśli  

komentarz 8 stycznia 2022 przez SzkolnyAdmin Szeryf (86,360 p.)
W przypadku zrobienia PK na dwóch polach tabeli, serwer sam przypilnuje, aby user nie ocenił książki po raz drugi (insert do tabeli się nie powiedzie). Ale możesz również zamiast od razy wysyłać inserta, najpierw odpytać serwer, czy user już ocenił książkę. Zależy od wykonania aplikacji, np. możesz userowi wyświetlić tylko te książki, których nie ocenił do tej pory i w tym przypadku lepiej polegać na kontrolerze.
komentarz 8 stycznia 2022 przez Wiciorny Ekspert (270,170 p.)
ale dalej nie wyjasniłeś co znaczy "programowalne vs po stronie bazy danych " :) serio ja tutaj nie gryzę Cię tylko jestem ciekaw co masz na myśli
komentarz 9 stycznia 2022 przez SzkolnyAdmin Szeryf (86,360 p.)
Może użyłem żargonu, programowalne czyli np. zdajesz się na język programowania zamiast na sam serwer.

Podobne pytania

0 głosów
1 odpowiedź 437 wizyt
pytanie zadane 14 stycznia 2019 w PHP przez Greeenone Pasjonat (16,100 p.)
0 głosów
0 odpowiedzi 435 wizyt
pytanie zadane 27 grudnia 2018 w PHP przez chmod96 Obywatel (1,380 p.)
0 głosów
1 odpowiedź 112 wizyt
pytanie zadane 27 września 2022 w PHP przez Pico Obywatel (1,330 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...