Bonjour,
Je travaille actuellement sur un projet de CRM avec Laravel. Pour l'instant j'ai un fonctionnement assez basique avec des clients qui possèdent un ou plusieurs projets.

Chaque projets possède des informations comme des accès FTP, base de données, back-office etc...
Après m'être renseigné sur l'organisation de mes données, je suis parti sur un système d'héritage qui se présente comme ceci :

Client : ID, NAME
Projet : ID, ID_CLIENT, NAME
Meta : ID, ID_PROJET, IDENTIFIANT, PASSWORD, URL
Meta_FTP : ID, PORT, PROTOCOLE
Meta_DB : ID, DB_NAME
Meta_BO : ID, ROLE

L'idée c'est d'avoir une table "Meta" avec les informations communes à tous les types de meta, en l'occurence un identifiant, un mot de passe et une url.
Ensuite chaque table "FTP, DB et BO" contient ses données spécifiques.

J'ai une relation "One To Many" entre "Projet" et "Meta" et ensuite j'ai opté pour une relation "One To One polymorphique" entre la table "Meta" et ses tables enfants.

J'ai donc mis à jour ma table "Meta" en ajoutant deux champs : "META_TYPE" et "META_ID" qui va contenir le type de meta dans le premier cas et l'id de la meta dans le second.

Sur le principe ça fonctionne, j'ai pu essayer de retrouver mes données avec des données insérées manuellement dans le base.

Maintenant la partie la plus complexe pour moi, c'est d'insérer des données depuis des formulaires sur le site.
La création d'un projet ça fonctionne bien. Par contre pour la création d'une meta je suis perdu.

J'ai créé un formulaire pour ajouter un FTP par exemple qui va contenir les champs : identifiant, password, url, port et protocole.
Les trois premiers doivent aller dans la table "meta" et les deux derniers doivent aller dans la table "meta_FTP". Je galère un peu à faire ça déjà et en plus dans ma table "meta" je dois insérer le "meta_type" et "meta_id" de ma relation mais je ne sais pas comment faire.

Dois-je récupérer les données du FTP dans $request puis l'ajouter et ensuite récupérer les données de la meta dans $request + l'id du FTP précédemment enregistré pour créer la meta ?

Si quelqu'un peut m'éclairer à ce sujet je suis preneur. Merci d'avance

3 réponses


popotte
Réponse acceptée

Mmmh normalement tu créée le model quii n'a pas de cle etrangère en premier, et ensuite la table parente

Tu peux passer;

    $metaFtp = new MetaFtp();
    $metaFtp->port = $request->port;
    ...
    $metaFtp->save();

Puis ensuite:

$meta = new Meta();
$meta->identifiant/pass/url = $request->idem;
$meta->meta_ftp->save($meta_ftp)

Pour la colonne meta_id la relation est supposé comprendre qu'il faut remplir le meta_id (enfin dans ta relation il faudra peut etre le spécifier en argument que la colonne pivot s'appelle bien "meta_id" car la relation prends en compte le nom de la function de relation qui est "metaFtp", il va donc chercher a remplir "meta_ftp_id", donc faut ajouter un argument dans hasOnePoly qui sera le nom de la colonne pivot: "meta_id") avec l'id du model metaFtp

Pour le meta_type je dirais un champ hidden sur chaque formulaire qui donnera le type et tu le recup dans $request, je vois pas comment faire autrement :/

Maintenant faut aussi trouer le moyen de choisir dynamiquement quelle classe il faut créer, si c'est ftp db ou bo, si les formulaires sont dans des pages séparées bon chaque controlleur fait sa vie, mais si les formulaires dépendent du même controller, la faudra trouver un moyen :/

Après j'aurais fait autrement, j'aurais utilisé la façon de faire quand on fait des logs d'evenements (debug, tracking, etc...):

juste la table Meta:
ID, ID_PROJECT, meta_type, metadata
-->metadata: JSON([
ID, PORT/PROTOCOLE si c'est un ftp,
DB_NAME si c'est un db,
ROLE si c'est un bo
])

Puis pour le model Meta j'aurais ajouté un trait Metadata pour ajouter une function getMetadata qui va decode le JSON puis renvoyer une classe, ensuite pour recup chaque info tes trois classes enfant j'en aurait fait des trait sur Meta et chaque trait a une fonction pour récupérer leur infos

Comme ca plus besoin de remplissage dynamique selon la relation, t'as un json tu fourres bêtement les infos cle valeur dedans avec json_encode, et quand tu veut récupérer les données tu utilises json_decode puis tu utilises la colonne 'meta_type' pour savoir ce qui est dispo dans metadata

Salut,

Merci pour ta réponse détaillée.
J'ai testé, effectivement dans le bon ordre ça fonctionne plutôt bien.

Par contre je vais aller faire des recherches sur le stockage au format JSON qui paraît assez souple pour ce que j'ai à faire.
Encore merci

Avec plaisir ;)