Bonjour,
Voila je rencontre un petit problème avec mon code.
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 :
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');
}
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 ? :/
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
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...