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;
Puis ensuite:
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