[Eloquent] Relaties werken niet zoals verwacht

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Schonhose
  • Registratie: April 2000
  • Laatst online: 09-09 15:28

Schonhose

Retro Icoon

Topicstarter
Goed, naar lang getwijfeld te hebben toch maar besloten om wat hulp in te roepen. Ik ben onlangs begonnen met Laravel en probeer dit werkend te krijgen met een database. In het onderstaande figuur zie je een versimpeld EER diagram.

Afbeeldingslocatie: http://home.schonhose.nl/simplified_scheme.png

Voor het overzicht heb ik alle andere kolommen er even uit gehaald. Via SQL kan ik hiermee alles benaderen, maar dit krijg ik nog niet voor elkaar met Eloquent. Ik heb diverse relaties gelegd en sommige dingen werken wel en anderen niet.

Via tinker heb ik verschillende dingen lopen en ik kom er niet meer uit.De reden dat ik het nog niet voor elkaar krijg is omdat ik nog niet 100% snap hoe Eloquent werkt bij ingewikkelde (en minder ingewikkelde :+) gevallen. Dit ondanks de boeken van Dale Reese, de documentatie van Laravel en het boek EasyLaravel.

Een aantal zaken werken wel, laat ik eerst uitleggen wat wel gelukt is.

* Users belongsToMany Clubs en vice-versa (n:n via pivottable club_user). Dit werkt, via Eloquent kan ik CRUD acties uitvoeren.
* Clubs haveMany Teams en Team belongsTo Club (n:1). Ook hierbij kan ik CRUD acties uitvoeren
* Teams belongsToMany Seasons en vice-versa (n:n via pivottable season_team) Ook hierbij kan ik CRUD acties uitvoeren

Het lukt mij ook om via Teams::with('Season', 'Club') om een lijst te krijgen van de teams met de bijbehorende seasons en clubs. Het lukt me niet om via Seasons alle teams & clubs te krijgen, maar ik denk dat dit via een hasManyThrough moet. Wat ik ook probeer, ik krijg het niet voor elkaar.

Dan de overige problemen. Zoals is te zien is de season_team tabel heel belangrijk, deze koppelt namelijk de spelers aan een bepaalde team/seizoens combinatie. Daarnaast koppelt het ook de staffmembers (coach), de wedstrijden en de trainingen.

Deze relaties zijn allemaal 1:n (een wedstrijd hoort bij 1 seizoen/team combo, maar een seizoen/team combo heeft meerdere wedstrijden). Het lijkt qua Eloguent heel simpel maar ik krijg het niet voor elkaar.

De volgende stap is het toevoegen van spelers/staffmembers. Deze hebben een 1:n koppeling met users: een speler is 1 user (belongsTo), maar een user kan speler zijn van meerdere team/season combinaties (hasMany). Hetzelfde geldt voor staffmembers.

Mijn vraag is dan ook, hoe leg ik de relaties op de juiste manier vast? Volgens mij heb ik me goed aan de eisen van Laravel gehouden mbt naamgeving (meervoud, enkelvoud, alfabetische volgorde etc) . Ik probeer terugkoppeling te krijgen via ->toSQL() om zo de query te zien. Dit lukt soms wel, en vaak niet. Ik denk daroom dat mijn relaties niet kloppen. Het is nu zo verleidelijk om via DB::raw alles binnen te trekken, maar dan leer ik het nooit.

Ik wil geen lappen code ontvangen maar vooral begrijpen hoe bepaalde dingen werken en dan vooral uitgaande van de season_team tabel omdat deze de sleutel is voor het onsluiten van de rest van de data.

Voorbeeld: hoe krijg ik van een player een overzicht voor welke cluib in welke teams/seizoen combinatie hij heeft gespeeld?

Wat weet ik wel:
* hasOne en belongsTo zijn een koppel voor 1:1 relaties.
* hasMany and belongsTo zijn een kopel voor n:1 relaties.
* belongsToMany is voor alle n:n relaties.
* Met de belongsTo en belongsToMany geef je aan dat de foreign key in deze tabel zit. hasOne en hasMany geven aan dat deze tabel de foreign key niet heeft.

[ Voor 3% gewijzigd door Schonhose op 03-08-2015 19:09 ]

"The thing under my bed waiting to grab my ankle isn't real. I know that, and I also know that if I'm careful to keep my foot under the covers, it will never be able to grab my ankle." - Stephen King
Quinta: 3 januari 2005


Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

En als je via je Eloquent query de join doet (met ->join())? De functies die vanuit Eloquent meekomen, zijn niet altijd even toereikend is mijn ervaring.

[ Voor 5% gewijzigd door CH4OS op 05-08-2015 16:18 ]


Acties:
  • 0 Henk 'm!

  • Barryvdh
  • Registratie: Juni 2003
  • Laatst online: 14:10
Of plaats even een stukje code wat je nu hebt, welke SQL query je krijgt en wat je verwacht had.
Het is nu nogal een flink lap tekst ;)

https://github.com/barryvdh/laravel-debugbar Misschien dat dat helpt met je queries bekijken?

Acties:
  • 0 Henk 'm!

  • Schonhose
  • Registratie: April 2000
  • Laatst online: 09-09 15:28

Schonhose

Retro Icoon

Topicstarter
Ik ben er vrijdagavond en vandaag druk mee bezig geweest. De conclusie is wat CptChaos hierboven al aangeeft: de functies zijn niet altijd even toereikend.

Kortom: ik heb eerst mijn SQL queries geschreven en daarna omgezet naar Eloquent relevante code als ->join() etc.

Op basis van mijn (matige) kennis van Laravel had ik verwacht dat het automagisch out-of-the box zou werken. Nu is dat voor een aantal zaken ook zo, maar een aantal dingen zijn zo ingewikkeld dat het niet altijd lukt.

"The thing under my bed waiting to grab my ankle isn't real. I know that, and I also know that if I'm careful to keep my foot under the covers, it will never be able to grab my ankle." - Stephen King
Quinta: 3 januari 2005