Bonjour,
Je ne trouve pas d'exemple de ce que je souhaiterais faire dans le Book, je vous soumets donc ma question.
J'ai une liaison HABTM entre 2 modèles et je souhaiterais enregistrer une nouvelle entrée (avec model::saveAssociated() ou saveAll() ou autre) qui contient plusieurs (nouvelles) entrées pour le modèle associé.
Concrètement :
Est-il possible d’enregistrer le tableau suivant ?
$data = array(
'Article' => array('title' => 'My article'),
'Tag' => array(
array('id' => 1),
array('id' => 2),
array('id' => 3),
),
);
$this->Article->saveAssociated($data);
Et, bonus, peut-on enregistrer sans passer par la clé primaire, sachant que ce sont de nouvelles entrées à créer ?
$data = array(
'Article' => array('title' => 'My article'),
'Tag' => array(
array('name' => 'Tag 1'),
array('name' => 'Tag 2'),
array('name' => 'Tag 3'),
),
);
$this->Article->saveAssociated($data);
J'espère que c'est clairement expliqué.
Merci pour votre aide.
Bonjour.
Tu n'as pas du regarder suffisamment loin dans le book, regardes : Sauvegarder les Données de Model Lié (HABTM=HasAndBelongsToMany).
En réponse à la 2ème partie, oui vu que de toute façon tu ne dois pas définir la valeur de la clé primaire pour de nouvelles données dans une sauvegarde en base de données.
Bonjour Lartak11,
Merci pour ta réponse.
Dans le book (je cite ci-dessous l'exemple), il y a un Tag par Recipee (moi je souhaiterais enregistrer plusieurs Tag d'un coup pour une Recipee).
De plus, ils ne précisent pas si Tag.name est clé primaire ou non sur la table. Or, je n'arrive pas à reproduire leur exemple si ce n'est pas en clé primaire (ai-je fait une erreur quelque part?).
Array
(
[0] => Array
(
[Recipe] => Array
(
[id] => 42
)
[Tag] => Array
(
[name] => Italian
)
)
[1] => Array
(
[Recipe] => Array
(
[id] => 43
)
[Tag] => Array
(
[name] => Pasta
)
)
[2] => Array
(
[Recipe] => Array
(
[id] => 51
)
[Tag] => Array
(
[name] => Mexican
)
)
[3] => Array
(
[Recipe] => Array
(
[id] => 17
)
[Tag] => Array
(
[name] => American (new)
)
)
)
Effectivement, on peut enregistrer en utilisant la clé primaire (Tag.id).
(Il faut imbriquer un Tag dans un Tag, un peu bizarre, non?
Par contre, ma deuxième question reste entière: peut-on enregistrer sans passer par la clé primaire (le Tag.name par exemple) ?
Merci.
$data = array(
'Article' => array('title' => 'My article'),
'Tag' => array(
'Tag' =>
array(
1,
2,
3
)
),
);
$this->Article->saveAssociated($data);
Non tu n'as pas compris, les tags sont bien en HABTM, c'est juste que dans l'exemple ils n'en affiche qu'un par recipe, mais ça ne veut pas dire que tu ne pourra en enregistré qu'un par rapport au modèle lié au HABTM.
Ensuite le name n'est pas la clé primaire pour Tag, sur les exemples de la Doc CakePHP, la clé primaire est toujours un champ id, car ils se basent sur les conventions de CakePHP et comme tu peux le voir le dernier tag listé dans le debug, c'est une insertion en base de données et non une tentative d'update ou autre.
Bonjour,
Je reprends ça à tête froide car j'ai décidément toujours des difficultés.
Quand je fais un enregistrement d'un article avec un Tag.name, je n'y arrive pas, je suis obligé de passer par l'id.
Avec le Tag.name, cela ne marche pas :
$data = array(
'Article' => array('title' => 'A new article'),
'Tag' => array('name' => 'test')
);
$this->Article->saveAssociated($data); //ou save($data)
Par contre, si je fais avec un Tag.id (sur un Tag qui existe déjà), cela marche :
$data = array(
'Article' => array('title' => 'A new article bis'),
'Tag' => array('id' => 1)
);
$this->Article->saveAssociated($data);
Résultats des 2 :
(à noter que j'ai aussi fait un "hasMany through")
$this->Article->find('all');
array(
(int) 0 => array(
'Article' => array(
'id' => '74',
'title' => 'A new article'
),
'ArticlesTag' => array(),
'Tag' => array()
),
(int) 1 => array(
'Article' => array(
'id' => '75',
'title' => 'A new article bis'
),
'ArticlesTag' => array(
(int) 0 => array(
'id' => '15',
'article_id' => '75',
'tag_id' => '1'
)
),
'Tag' => array(
(int) 0 => array(
'name' => 'Tag ajouté en bdd à la main',
'ArticlesTag' => array(
'id' => '15',
'article_id' => '75',
'tag_id' => '1'
)
)
)
),
)
Et si je veux enregistrer plusieurs Tags avec un article, j'ai seulement réussi de la façon dont j'ai décrit dans mon message précédent.
En tous cas, merci Lartak11 de t'être penché dessus.