2014-07-17 5 views
1

J'ai un contrôleur de produit et quand j'économise un nouveau produit je veux sauvegarder des enregistrements sur un autre contrôleur associé pour enregistrer les catégories auxquelles le produit est associé.cakephp - using create() ne fonctionnant pas comme prévu

Mon code J'utilise est:

$this->Product->create(); 
if ($this->Product->save($this->request->data)) { 
    $newProductId = $this->Product->getInsertID(); 
    //associate products with categories 
    foreach($categoriesToSave as $key=>$value) { 
     $saveArray['CategoriesProduct'] = array('category_id'=>$value, 'product_id'=>$newProductId); 
     $this->Product->CategoriesProduct->create(); 
     $this->Product->CategoriesProduct->save($saveArray); 
     $this->Product->CategoriesProduct->clear(); 
    } 
} 

Pour une raison que, même si $categoriesToSave a 10 articles en elle, que le tout dernier est sauvé. Il est donc évident de créer seulement un nouvel élément CategoriesProduct et de sauvegarder chaque enregistrement par-dessus le dernier au lieu de create() en en créant un nouveau. Est-ce que quelqu'un peut expliquer ce que je fais mal et comment je peux faire ce travail?

+1

Avez-vous une contrainte 'unique' sur le modèle' CategoriesProduct'? Ou une définition spécifique? Et quelle est la relation entre 'Product' et' CategoriesProduct'? – Holt

+0

Êtes-vous dans un environnement de débogage? Sinon, je vérifie toujours les journaux quand il se passe quelque chose qui n'est pas clair. Ils sont situés ici: app \ tmp \ logs – enigmasck

+1

omg ... Je suis un idiot dopey. J'avais omis la clé primaire pour la table categories_products - merci de le signaler :) –

Répondre

0

La façon dont je le ferais serait comme ceci:

//Add a counter 
$c = 0 
foreach($categoriesToSave as $key=>$value) { 
    $saveArray[$c]['CategoriesProduct']['category_id'] = $value; 
    $saveArray[$c]['CategoriesProduct']['product_id'] = $newProductId; 
    $c++; 
} 
$this->Product->CategoriesProduct->saveMany($saveArray); 

Je ne pense pas que la seule façon de le faire, mais cela ne devrait fonctionner très bien.

Bonne chance!

Questions connexes