Bonjour, j'ai un problème avec deux tables associées que j'aimerais créer et lier en même temps.
Lorsqu'un utilisateur s'inscrit, il remplit un formulaire très basique (email, username, password, etc.) qui stockera ses données dans ma table Users. Jusque là, tout va bien.
Cette table est associées à Profiles (User hasOne Profile), qui contiendra toutes les informations complémentaires de l'User et qui DOIT être créer en même temps que cet User, sans contenir aucunes données à sa création.
Ma question est le suivante : est-ce qu'il est possible de créer et sauvegarder cette association directement avec le $this->Users->save($user)
ou dois-je absoluement sauvegarder l'User en premier, récupérer l'ID qu'il générera, pour ensuite sauvegarder le Profile, (sachant que je comprends à moitié les Entities et leurs patchs) (j'ai encore du travail à faire de ce côté, ne m'incendiez pas).
if ($this->Users->save($user)) {
/*
$profile->user_id = $user->id
+ patchEntity();
+ surement autres choses
*/
if($this->Profiles->save($profile)) {
return $this->redirect(['action' => 'index']);
}
}
EDIT : le soucis avec cette façon, il me semble, c'est que s'il y a une erreur lors du $this->Profiles->save($profile)
, l'User sera sauvegardé sans Profile associé, ce qui - justement - posera des problèmes ailleurs.
Merci d'avance, en espérant être assez clair dans ma question.
Hello,
Sans l'ID de l'User, oui je crois que tu n'a pas le choix de faire la 2ième solution. saving-data.html#saving-hasone-associations
Pour la 2ième solution, tu peux faire ça :
if ($newUser = $this->Users->save($user)) {
$data = [
'user_id' => $newUser->id
];
$profile = $this->Profiles->newEntity($data);
if($this->Profiles->save($profile)) {
return $this->redirect(['action' => 'index']);
}
}
Tout d'abord, merci pour ta réponse Xeta. Je me suis inspiré de ton ajout manuel de l'user_id pour faire fonctionner mon save en une seule fois.
if ($this->request->is('post')) {
$usersTable = TableRegistry::get('Users');
$data = $this->request->data; // je stock les données du formulaire
$data['profile'] = [];
/*
j'y ajoute manuellement un tableau vide
"Profiles" devient "profile" selon les conventions de nommage
*/
$user = $usersTable->newEntity($data, [
'associated' => ['Profiles'] // nouvelle entitée, en associant Profiles
]);
if ($usersTable->save($user)) {
$this->Flash->success('Votre compte a bien été créé.');
return $this->redirect(['action' => 'index']);
} else {
$this->Flash->error($user->errors());
}
}
Je partage la façon de faire pour ceux qui pourraient être intéressés.