Relation one to many avec une table intermédiaire

47049
,

Bonjour,

Voila je rencontre un petit problème avec mon code.

Ce que je fais

Alors en fait j'ai besoin de créer des relations entre les utilisateurs et les structures auxquelles ils sont rattachés. Pour ça j'ai créé une table de correspondance des id (une sorte de map quoi) que j'ai nommée users_structures. La raison pour laquelle je n'ai pas juste ajouté un champ structure_id dans la table users est simple : j'ai besoin de plusieurs informations concernant cette relation (les timestamps, le nom de poste de l'utilisateur etc). Voici un exemple de la table :

  • id
  • user_id (unique)
  • structure_id
  • jobname
  • status
  • created_at
  • updated_at

De manière général, quand on utilise le système de base (avec un champ structure_id dans la table users donc), on peut facilement utiliser Eloquent pour réaliser la relation au niveau de PHP avec un bout de code similaire à ce qui suit :

/**
* Check if the user is related to a structure
*
* @return boolean
*/

public function isRelatedToStructure () {
    if ($this->structure === null) {
        return false;
    }
    return true;
}

/**
* Return the structure the user is related to
*
* @return  Structure
*/

public function structure() {
    return $this->belongsTo(Structure::class, 'structure_id');
}

Ce que je veux

Ainsi je me demandais comment je pouvais le faire proprement avec Eloquent (si c'est possible). J'ai l'impression que je pourrai faire un Many to Many mais j'ai peur que le code ne soit plus assez explicite de ce qu'il doit réellement faire... Car un utilisateur ne peut appartenir qu'à une seule structure (d'où la présence du modificateur unique :)

Qu'en pensez-vous ? Dois-je utiliser le système de Many to Many au risque d'induire en erreur de futur développeurs qui reprendraient le projet et donc d'écrire un code fonctionnel non clair ? :/

2 Réponse

Default
,

si tes règles de gestion sont les suivantes:
-un utilisateur ne peut appartenir qu'a une seule structure
-une structure peut avoir plusieurs utilisateurs
alors c'est une relation one to many dont tu as besoin

47049
,

Oui la relation est bien du type One To Many mais en fait j'ai besoin de créer une table intermédiaire pour représenter un objet UserStructure qui me permet de sauvegarder des informations à propos de cette relation : le nom du poste de l'utilisateur qui rejoint la structure, le status de la demande d'adhésion à la structure etc. C'est pour ça que je n'ai pas fait un simple One To Many. Mais j'ai réglé le problème finalement :
User.php

public function userStructure() {
  return $this->hasOne(UserStructure::class, 'user_id');
}

public function structure() {
  return $this->userStructure->structure();
}

Structure.php

public function structureUsers() {
  return $this->hasMany(UserStructure::class, 'structure_id');
}

public function users() {
  return $this->belongsToMany(User::class, 'users_structures', 'user_id', 'user_id');
}

UserStructure.php

public function user() {
  return $this->belongsTo(User::class, 'user_id');
}
public function structure() {
  return $this->belongsTo(Structure::class, 'structure_id');
}

Le seul problème c'est que je ne suis pas sûr que le code soit très compréhensible lorsqu'on ne l'a pas conçu soi-même...