Bonjour, j'ai deux tables qui doivent entrer en relation dans un seul et même controlleur. Quand on crée une table, je voudrais qu'au moment d'éditer cette même table, on puisse y associer une nouvelle table (avec pour clé étrangère l'id de la première table). J'utilise une fonction belongsTo() entre les deux tables mais j'imaigne que je dois oublier quelque chose pour accéder d'une table à l'autre. Car d'un côté, l'id est crée, de l'autre, je dois pouvoir créer un nouvel id dans ma deuxième table quand on édite la première table.

Merci beaucoup pour votre aide. J'imagine que je dois exploiter d'avantages éloquent pour cela.

7 réponses


Hello :)

Alors pour la relation quand tu dis que tu veux y associer la nouvelle table, tu veux dire que tu veux récupérer les infos de la nouvelle table ou bien tu veux pouvoir modifier une colonne dans la nouvelle table?

En gros dans les models tu dois placer un belongsTo dans la nouvelle table oui, mais tu dois aussi placer un hasOne ou un hasMany dans la table de base (ça dépends si la table de base peut n'avoir qu'un seul ou plusieurs lignes de la nouvelle table) ensuite dans la migration faut ajouter la clé étrangère, et pour récup l'info ça mmarche comme un objet: $model1->model2

Bon j'ai pas trop compris ce quue tu veux faire dans le détail (avec un exemple de code ce serait plus clair :p) du coup je t'ai donné le truc de base, sinon la doc explique plusieurs scénarios possibles: https://laravel.com/docs/9.x/eloquent-relationships

Bonjour, en fait je suis débutante en laravel. Je n'ai pas tout compris avec les relations mais oui j'ai bien mes deux relations hasOne et belongsTo.
Pour cela les relations sont faites. Mon problème est que je travaille dans un seul controlleur pour deux modèles.
En première étape je créé l'id de la table1.

Au niveau de ma fonction store() du modèle de la table1, je crée la table 2 également (qui n'aura q'un id à ce moment là) -> cette table possède la clé étrangère qui va me permettre par la suite de faire la relation avec la table1.

Dans la fonction update(), lors de l'enregistrement, je voudrais pouvoir enregistrer dans un autre champs de la table2 (qu'on appelle table1_id) la valeur de l'id table1.
C'est un peu difficile à expliquer comme cela.

Grosso modo, ce sont des questionnaires à compléter, qui partent d'une table différente(dans mon cas la table2) et qui doit être liée à la table1 et pour cela au moment de la création de table_2, je dois pouvoir avoir dans cette table l'id de table1 enregistré.

Merci pour votre aide

Ah okay, alors en gros faut que tu prépares ton deuxième modèle, ensuite tu le save en associant le model 1, du coup ça va save le mmodel 2 avec l'id du model 1, ensuite tu refresh le model 1 pour y charger le model 2, et c'est bon :p

// $model1 = modèle de la table 1
// $model2 = modèle de la table 2

$model2 = new Model2();
$model2->attribute = 'value';
$model2->attribute2 = 'value2';
// etc...

$model1->model2()->save($model2);
 
// Faut refresh le model1 pour refetcher et détecter ton model2
$model1->refresh();

// Et tu peux récupérer les données de ton model2 comme ça
$model1->model2;

Merci pour ton aide, ceci m'a permis de trouver la solution pour cela. Je ne suis pas sûre que ma méthode soit optimisée mais cela fonctionne.
en gros j'ai cela maintenant et cela fonctionne :
dans la fonction edit() de table1:

" if (!table2->find($id) { $table2 = new Table2 (['new_field', $id]); $table1_id = $this->table1::find($id); $table1_id->table2()->save($table2); } "

Voilà pour moi ça me semble ok. Enfin si je vois que je peux améliorer par la suite je le ferai merci beaucoup ton aide m'a été précieuse :)

Avec plaisir ;)

Alors en vrai y a mieux :p

Table2::firstOrCreate(['table_1_id' => $table1Id, 'new_field' => 'new_value']); // Soit le table 2 existe déjà donc ça fait rien à par te retourner le modèle, soit il n'existe pas et il en crée un... Et il te retourne le modèle :p

// Il y a une variante aussi c'est "firstOrNew" cette fois il te crée une nouvelle instance de modèle, par contre à la différence de "firstOrCreate" ça ne va pas persister donc faudra le faire avec $table2->save();

Bonjour, j'ai testé différemment, car mon id est déjà dans la fonction update via une variable $id. donc maintenant j'ai ceci :
"'Table2::firstOrCreate(['table2_id' => $id'])'"
et ça a l'air de fonctionner. Qu'en penses tu ??
Merci beaucoup, je travaille toujours dans le controlleur de la table1 pour cela.
C'est super d'avoir une aide simple et efficace.

Alors si tu fais firstOrCreate uniquement avec un champ 'table1_id', si il n'existe pas, ça va uniquement créer une ligne avec un id, les autres chhamps seront null :p

Esuite un champ table2_id dans la table2 ça parait bizarre, normalement c'est le nom de la table-parent + _id pour l'id de la table 2 tu as déjà le champ id tableN_id c'est pour associer avec une autre table en principe ^^'

Par ex une table post avec des comments, pour crééer un commment faut faire Comment::firstOrCreate(['post_id' => $id]) ... ou ualors c'est une faute de frappe :p

De rien ^^ Un conseil regardes un peu la doc Laravel, tu as plein de petites fonctions comme ça qui permet de faire des trucs très simplement, par exemple tu peux faire l'inverse créer un parent avec associate, ou alors pour une relation many2many tu as sync et syncMany, enfin y'a plein de trucs pratiqueus :p