Bonjour à tous,

Je tiens tout d'abord à dire un grand merci à Grafikart pour ses tutos qui m'apportent une aide précieuse en développement. Un grand merci.
J'ai bien suivie le tuto "faire un site en 7 jour", qui m'a permit de mieux comprendre le principe d'un site basé sur une structure MVC et aussi donc de m'améliorer sur la maitrise de PDO. Il faut encore que je digère pas mal de choses et que je revoie certains points mais dans la grande majorité, c'est beaucoup plus clair maintenant.
Je tente toutefois d'obtenir de l'aide sur le forum afin de trouver une réponse à la question suivante. J'ai cherché sur le web mais les quelques éléments que j'ai trouvés m'ont plutôt embrouillés.
Voilà, on créé des models qui correspondent à chacune de nos tables et qui seront appelés dès que l'on en a besoin, ok. Mais si nos tables possèdent des sous-clées, si elles possèdent des champs qui sont joint avec une autre table, comment doit-on procéder lors d'un insert, pour un update ou delete ? La réponse ira de soit pour certains chevronnés, mais j'aimerais comprendre, merci pour votre indulgence...

Merci à tous. :-)

2 réponses


Donovan
Réponse acceptée

Tu vas creer tes modèles pour toutes les tables de ta base de données, exemple :

Table "Users"
Champs :
id
username
password

Le modele sera donc une classe nommée "User", contenu dans un fichier User.php

Table "Profiles"
Champs :
id
user_id >> Voila une clé étrangére (ou sous-clée comme tu appel ça)
first_name
last_name
gender

Le modele sera donc une classe nommée "Profile", contenu dans un fichier Profile.php

Mais et mes liaisons alors ?

Et bien dans le modèle User, tu défini que l' "User" à un "Profile" en y inscrivant une relation "hasOne".

User >> hasOne >> Profile
(Utilisateur possède un et un seul profil)

Comme ceci :

public $hasOne = array('Profile');

Dans ton modele "Profile", tu peux définir qu'un profil appartient à un (et un seul) User. En faisant une relation "belongsTo" :

Profile >> belongsTo >> User
(Profil appartient à User)

Mais et pour ce qui est des Insert ? Update et Delete ? :O

C'est simple :

Pour l'insert / update : Une fois ta relation définie, tu pourras passer dans ton save "User" un tableau avec les données "Profile" qui seront save automatiquement.
Du genre :

Insert :

$this=>User->save(array(

'User' => array(

'username' => "Yuki",

'password' => 'pouet.'

),

'Profile' => array(

'first_name' => 'Yuki_firstname',

'last_name' => 'yuki_lastname',

'gender' => 'm'

)

));

Et .. Magie ! Cake se chargera d'assigner le bon user_id !

Pour ce qui est du delete, tu peux faire en sorte de supprimer les informations liés lors de la suppression du parent en ajoutant le parametre de configuration "dependent" dans tes relations hasOne et hasMany :

Pour reprendre l'exemple plus haut :
Dans mon fichier user.php :

public $hasOne = array(
    'Profile' => array(
        'dependent' => true
    )
);

Ce qui provoquera la suppression du profil lors de la suppression de l'utilisateur rattaché :) !

Pour que le système marche, il faut bien évidemment respecter les conventions de nommage concernant la clé étrangère (sous-clé) qui prend la forme "nomdumodeleausingulier_id". Et voilaaaa !

Ici j'ai parlé uniquement de la liaison "hasOne", la liaison "hasMany" fonctionne "quasiment" pareil, à la différence que le modele parent peux avoir plusieurs enfants :

Post (Article) >> hasMany >> Comment (Commentaire)

Et la structure des données à save sera donc :

$this->Post->saveAll(array(

'Post' => array(

'title' => "1er article !"

),

'Comment' => array(

array(

'pseudo' => 'Yuki',

'comment' => "Firsttttt !"

),

array(

'pseudo' => 'Yuki's twin',

'comment' => "Chiotte, j'suis pas le premier."

)

)

));

Tu noteras l'utilisation de "saveAll" et non de "save" qui permet de save plusieurs enregistrement en même temps (Documentes toi sur saveAssociated et saveMany au passage, ça pourra t'être utile.)

Voilaaaaa !

J'espere que j'ai bien pigé la question parce que j'ai mis toute mon âme dans cette réponse 8D

Yuki~

Salut !!!!
écoute ta réponse est, hummmm, je dirais extraordinaire. Je vois bien que tu t'es vraiment investi pour y répondre et je t'en remercie énormément, c'est trop classe. J'adore ce site, j'y trouve vraiment des ressources incroyables et à chaque fois j'ai le déclic comme on dit.
Je vais maintenant reprendre tout cela et me faire des test d'application pour m'exercer, c'est top, je vais aller aussi voir les vidéos qui traitent de cake pour le coup.
Effectivement, je parlais des clés étrangères (Oups, faut que je me professionnalise un peu plus), j'invente des mots parfois sur le coup, mais tu as très bien déduit. :-)

Merci, merci, :-)