2009-02-17 6 views
-1

Je suis en train de mettre à jour les tables avec un a et appartient à la relation beaucoup (HABTM).enregistrements Enregistrement HABTM lorsqu'ils ne sont pas toutes les colonnes de jointure de table sont les clés étrangères

Quand ma table de jointure ressemblait à ceci:

CREATE TABLE IF NOT EXISTS `items_labels` (
    `item_id` int(11) NOT NULL, 
    `label_id` int(11) NOT NULL 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

J'utilise CakePHP, pour que je puisse mettre à jour les tables avec $ this-> item-> save ($ data) où les données $ ont été:

Array 
(
    [Item] => Array 
     (
      [id] => 1 
     ) 
    [Label] => Array 
     (
      [Label] => Array 
       (
        [0] => 4 
        [1] => 5 
        [2] => 7 
        [3] => 8 
       ) 
     ) 
) 

J'ai ajouté une colonne à ma table de jointure, il ressemble maintenant:

CREATE TABLE IF NOT EXISTS `items_labels` (
    `item_id` int(11) NOT NULL, 
    `label_id` int(11) NOT NULL, 
    `user_id` int(11) NOT NULL 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

Quand je sauve des données $, je veux aussi sauver un identifiant d'utilisateur. L'identifiant de l'utilisateur sera le même pour tous les enregistrements d'une même opération de sauvegarde.

Quelqu'un peut-il me aider à comprendre ce que le tableau de données $ doit ressembler afin d'intégrer l'ID utilisateur? Merci.

+0

Remplacez la balise 'mysql' par 'cakephp'. – skypher

Répondre

2

Cela devrait fonctionner:

Array 
(
    [Item] => Array 
     (
      [id] => 1 
     ) 

    [Label] => Array 
     (
      [Label] => Array 
       (
        [0] => Array 
         (
          [label_id] => 4 
          [user_id] => 1 
         ) 

        [1] => Array 
         (
          [label_id] => 5 
          [user_id] => 1 
         ) 

        [2] => Array 
         (
          [label_id] => 7 
          [user_id] => 1 
         ) 

        [3] => Array 
         (
          [label_id] => 8 
          [user_id] => 1 
         ) 

       ) 

     ) 

) 

Il va générer multiaxes, mais travaillera avec une sauvegarde appel.

+0

Salut Matt, j'ai déjà lu ton blog. C'est bien d'avoir une réponse de votre part ici sur SO. Merci. –

1

modèle CakePHP :: méthode save() ne le fera pas pour vous autant que je sache. Je pense que vous devez utiliser model :: saveAll() et l'appeler sur le modèle "with". CakePHP est automagiquement conscient de votre table de jointure et peut la modéliser sans avoir à créer un fichier de modèle physique et à vous classer. Tout ce que vous devez faire est de formater le tableau de données au format que SaveAll attend.

Je ne l'ai pas essayé, mais quelque chose comme ce qui suit devrait fonctionner.

<?php 
class Item extends AppModel { 
    var $name = 'Item'; 
    var $_habtmData = null; 
    function beforeSave() { 
    $this->unbindModel(array('hasAndBelongsToMany' => array('Label'))); 
    $this->_habtmData = $this->data['Label']; 
    } 
    function afterSave() { 
    if (is_array($this->_habtmData) && !empty($this->_habtmData)) { 
     foreach ($this->_habtmData['Label'] as $k => $labelId) { 
     $this->_habtmData['Label'][$k] = array(
      'item_id' => $this->id, 
      'label_id' => $labelId, 
      'user_id' => $userId, // Get this from somewhere 
     ); 
     } 
     $this->bindModel(array('hasMany' => array('ItemsLabel'))); 
     $this->ItemsLabel->saveAll($this->_habtmData); 
    } 
    } 
} 
?> 

Tout cela est fait dans le modèle (comme il se doit), donc votre contrôleur et vos vues restent propres. Nous faisons tout cela dans afterSave, donc il ne l'essaie que si les données de l'item sont validées. Pour l'essentiel, nous dissocions temporairement l'association d'élément hasAndBelongsToMany dans beforeSave, de sorte que les données HABTM ne sont pas enregistrées et nous stockons les données HABTM dans une propriété du modèle, nous pouvons donc l'utiliser dans afterSave (même si c'est probablement encore disponible alors de toute façon). Nous lions ensuite le modèle "with" à Item avec une association hasMany, et formateons les données comme requis par la méthode core :: saveAll() de CakePHP, avant de l'appeler finalement sur le modèle "with", en passant dans le nouvelles données.

Il devrait fonctionner en théorie - bonne chance et laissez-moi savoir comment vous allez ;-)

+0

Hey, merci pour la réponse détaillée. L'approche de Matt Curry a fonctionné pour moi et était beaucoup plus simple. Votre réponse est mise en signet car cela peut être utile si je rencontre une situation avec des données HABTM plus complexes. –

Questions connexes