[Datamodel] dubbele koppeltabel

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

  • Icey
  • Registratie: November 2001
  • Laatst online: 20:47
Ik heb drie modellen, een gebruiker (user), organisatie (company) en project (eeehm).
  • Een gebruiker is gekoppeld aan één of meerdere organisaties
  • Een organisatie is gekoppeld aan één of meerdere projecten
  • Een project is gekoppeld aan één of meerdere gebruikers
Afbeeldingslocatie: https://tweakers.net/i/lZQtr-HSbAvL9lgCPwCRT-rwBTM=/full-fit-in/4000x4000/filters:no_upscale():fill(white):strip_exif()/f/image/FQ4WqOctj508QOUnu429XFOn.png?f=user_large

Bovenstaande werkt; maar voor mijn gevoel klopt dit niet. Alle gebruikers kunnen nu aan een projecten gekoppeld worden terwijl je eigenlijk alleen de gebruikers die aan de betreffende organisatie zijn gekoppeld wilt kunnen toevoegen.

Zie ik iets over het hoofd? Of klopt mijn hele datamodel gewoon niet. Laravel biedt wel de mogelijkheid om te filteren op de pivot velden maar dat is in dit geval niet van toepassing. En ze hebben wel een hasManyThrough maar die werkt niet met een many-to-many.

Alle reacties


Acties:
  • 0 Henk 'm!

  • armageddon_2k1
  • Registratie: September 2001
  • Laatst online: 25-04 18:21
Bovenstaande werkt; maar voor mijn gevoel klopt dit niet. Alle gebruikers kunnen nu aan een projecten gekoppeld worden terwijl je eigenlijk alleen de gebruikers die aan de betreffende organisatie zijn gekoppeld wilt kunnen toevoegen.
Oh? Is dat dan een harde eis? Wat nou als je een consultant van bedrijf A hebt die mee gaat doen bij een project van bedrijf B?

De vraag is of users onderdeel zijn van een project of dat users meewerken aan een project. Semantisch een verschil.

[ Voor 14% gewijzigd door armageddon_2k1 op 10-03-2022 15:09 ]

Engineering is like Tetris. Succes disappears and errors accumulate.


Acties:
  • 0 Henk 'm!

  • Icey
  • Registratie: November 2001
  • Laatst online: 20:47
In mijn optiek zou hij dan eerst gekoppeld moeten worden aan bedrijf B. Laat ik het anders zeggen; als iemand van bedrijf A inlogt ziet hij alleen zijn eigen gebruikers en niet die van bedrijf B.

Acties:
  • 0 Henk 'm!

  • Kontsnorretje
  • Registratie: Augustus 2011
  • Laatst online: 14-06-2024
Je laatste antwoord helpt niet... Een gebruiker kan aan 1 of meerdere organisaties gekoppeld worden stel je in de eisen.

De situatie die armageddon schetst is dus zeker van toepassing op het moment dat een gebruiker aan 2 of meer bedrijven en projecten is gekoppeld. Dit scenario merk ik ook binnen mijn werk, waar ik bij bedrijf X werk, en voor bedrijf A, B en C hun tickets beheer (wat overeen lijkt te komen met jou situatie).

Ik mis in deze een beetje de autorisatie. De project_user tabel uitbreiden met een company kolom kan een eerste stap zijn (al kan je die al herleiden uit de company_user tabel).

Acties:
  • 0 Henk 'm!

  • Knutselsmurf
  • Registratie: December 2000
  • Laatst online: 15:51

Knutselsmurf

LED's make things better

Volgens mij kun je dit opvangen door de project-user niet direct naar de user te laten wijzen, maar naar de company-user

- This line is intentionally left blank -


Acties:
  • 0 Henk 'm!

  • Artaex
  • Registratie: Oktober 2011
  • Laatst online: 18:24
Ik denk dat je project_user weg wilt halen. Er is een package waarmee je diepere relaties kunt maken: https://github.com/staudenmeir/eloquent-has-many-deep

Daarmee zou het moeten lukken om vanaf een user via companies alle projects op te halen.

Acties:
  • 0 Henk 'm!

  • Knutselsmurf
  • Registratie: December 2000
  • Laatst online: 15:51

Knutselsmurf

LED's make things better

Artaex schreef op vrijdag 11 maart 2022 @ 09:40:
Ik denk dat je project_user weg wilt halen. Er is een package waarmee je diepere relaties kunt maken: https://github.com/staudenmeir/eloquent-has-many-deep

Daarmee zou het moeten lukken om vanaf een user via companies alle projects op te halen.
De vraag gaat niet over het ophalen van de beschikbare projecten, maar over het koppelen van projecten aan gebruikers. Als ik de vraagstelling goed begrepen heb, is het juist de bedoeling om users specfiek aan projecten te kunnen koppelen.

Als de koppeling tussen gebruikers en projecten echter een op zichzelf staande koppeling is, is het lastiger om bij verbreken/beëindigen van de company-user relatie ook direct de koppeling tussen de user en de projecten van die company te beëindigen.

Door, zoals ik al eerder had geschreven, de koppeling van project_user niet naar user te leggen, maar naar compay_user, is bij het verbreken van de koppeling tussen copany en user direct helder welke projecten bij die specifieke koppeling horen en dus inactief gemaakt moeten worden.

Op welke wijze dat laatste gebeurt is uiteindelijk afhankelijk van de wijze waarop de koppeling wordt bijgehouden.

Persoonlijk ben ik er voorstander van om in situaties als deze in zowel de company_user and project_user de geldigheid bij de houden met een datum/timestamp van/tot. Beëindiging van de betreffende koppeling gebeurt dan niet door het verwijderen van een record in de koppeltabel maar door de einddatum in te vullen. Op die maier blijft de historie beschikbaar over wie wanneer toegang heeft gehad.

- This line is intentionally left blank -


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Ik heb de titel even aangepast, aangezien het niet een vraag specifiek voor Laravel is.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • +1 Henk 'm!

  • Orion84
  • Registratie: April 2002
  • Laatst online: 22:19

Orion84

Admin General Chat / Wonen & Mobiliteit

Fotogenie(k)?

Icey schreef op donderdag 10 maart 2022 @ 14:31:
Bovenstaande werkt; maar voor mijn gevoel klopt dit niet. Alle gebruikers kunnen nu aan een projecten gekoppeld worden terwijl je eigenlijk alleen de gebruikers die aan de betreffende organisatie zijn gekoppeld wilt kunnen toevoegen.
De hamvraag is of dat iets is wat je in je datamodel moet willen oplossen. Dit is iets dat je prima in je applicatie logica kan afdwingen. Of desnoods met constraints op je DB (geen idee of dat hier echt helemaal van toepassing / bruikbaar voor is, maar je zou daar eens naar kunnen kijken).

The problem with common sense is that it's not all that common. | LinkedIn | Flickr


Acties:
  • 0 Henk 'm!

  • Icey
  • Registratie: November 2001
  • Laatst online: 20:47
Ik denk dat je gelijk hebt @Orion84; met behoud van standaard Laravel relaties kan ik het simpelweg oplossen binnen de applicatie. In dit geval Laravel Nova.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
     * Build a "relatable" query for the given resource.
     *
     * This query determines which instances of the model may be attached to other resources.
     *
     * @param  \Laravel\Nova\Http\Requests\NovaRequest  $request
     * @param  \Illuminate\Database\Eloquent\Builder  $query
     * @param  \Laravel\Nova\Fields\Field  $field
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public static function relatableProjects(NovaRequest $request, $query)
    {
        $resourceId = $request->route('resourceId'); 

        return $query
            ->select('projects.*')
            ->join('companies', 'companies.id', '=', 'projects.company_id')
            ->join('company_user', 'company_user.company_id', '=', 'companies.id')
            ->where('company_user.user_id', $resourceId);
    }
Pagina: 1