Wpis z mikrobloga

Witam, szybkie pytanko, piszę prostą gierkę via WWW i przy okazji chciałem się nauczyć #laravel

Zastanawiam się jak rozwiązać pewien problem zw. z przechowywaniem danych mam encję Gracz i TypPrzedmiotu. Jeden gracz może mieć wiele przedmiotów danego typu, podobnie jeden typ może byś posiadany przez wielu graczy, więc teoretycznie sprawa jest prosta relacja n:m

Tak by wyglądał schemat bazy:

tabla gracz(id, nazwa)

1, 'gracz1'

2, 'gracz22'

tabla typprzedmiotu(id, nazwa)

1, 'miecz'

2, 'tarcza2'

3, 'stalowa tarcza'

tabla posiadane
przedmioty(gracz, przedmiot)

1, 2

1, 2

2, 3

Coś takiego jak napisałem wyżej potrafię w EloquentORM zrobić, tylko problem jest taki że ilość wielu przedmiotów będzie szła w tysiące, więc nie będę przechowywał po 1000 rekordów tylko dlatego żeby mieć 1000 mieczy itp. Rozwiązaniem jest przechowywanie w tablicy posiadane przedmioty ilości:

tabla posiadane_przedmioty(gracz, przedmiot, ilość)

1, 2, 2

2, 3, 1

I tego już w EloquentORM zrobić nie potrafię, jakieś wskazówki, może jakoś inaczej podejść do problemu?

#php
  • 8
@marek04: Potrzebujesz identyfikować przedmioty indywidualnie – czy też nie ma znaczenia który egzemplarz miecza posiada użytkownik?

Jeśli indywidualnie, to robisz po 1000 rekordów dla 1000 mieczy – w końcu musisz je jakoś rozróżniać.

Jeśli nie, to robisz tak jak pisałeś pod koniec (hint: szukaj w dokumentacji jak robić relacje many–to–many).
@MacDada: nie potrzebuję indywidualnie, właśnie zrobiłem many - to - many, ale jak dodaje przedmiot do Gracza to tworzy mi kolejny rekord w posiadane_przedmioty, a chcę żeby tam zwiększył ilość, a nie dodawał rekord, próbowałem googlować many-to-many with count ale nie bardzo coś znajduję
@marek04: Bo dodajesz nowy przedmiot (nowy rekord) – a powinieneś modyfikować istniejący.

Czyli musisz to ręcznie zaimplementować: pobierasz rekord z tabelki pośredniczączej:

* jak nie istnieje, to tworzysz nowy

* jak istnieje, to zwiększasz licznik

* dokładasz unique index, żeby mieć pewność, że nie potworzysz zbędnych nowych relacji.

Ewentualnie możesz to nawet uprościć i zrobić w tym stylu one2many: na użytkowniku trzymać liczbę przedmiotów.
@MacDada: W MySQL można też wykorzystać

INSERT ... ON DUPLICATE UPDATE
- wtedy kompozytowy unique załatwia sprawę sprawdzania i wybierania pomiędzy INSERT a UPDATE.