2012-02-16 2 views
0

Dans mon application Les citations appartiennent à un produit, qui à son tour appartient à un matériau. Comme je ne peux pas obtenir le modèle afterFind du modèle de produit pour inclure le matériel quand il est accédé à partir du modèle de devis, j'ai associé le devis directement avec un matériau.CakePHP - accès au modèle associé dans beforeSave

Le problème que je vais avoir est maintenant que le material_id pour la citation doit être enregistré automatiquement en fonction du produit qui est sélectionné pour la citation

-à-dire en tirant la valeur de Product.material_id du produit sélectionné et l'enregistrer automatiquement dans le champ Quote.material_id avant que le devis ne soit enregistré dans la base de données.

Je ne suis pas familier avec cakePHP. Est-ce que quelqu'un sait comment cela peut être fait?

EDIT:

Voici un exemple pour expliquer. Dans mon modèle de citation que je peux avoir:

public function beforeSave($options) { 
    $this->data['Quote']['material_id'] = 4; 
    return true; 
} 

mais je dois faire quelque chose comme ce qui ne fonctionne pas:

public function beforeSave($options) { 
    $this->data['Quote']['material_id'] = $this->Product['material_id']; 
    return true; 
} 

Répondre

3

Je suis choqué cela n'a pas été correctement encore répondu ....

Réponse Oldskool est semi-correct, mais pas tout à fait raison. L'utilisation de "$ this-> Quote" est incorrecte, car la fonction beforeSave elle-même réside dans la classe Quote. Je vais expliquer en utilisant un exemple.

-> Nous avons un modèle Abonnement qui belongsTo un SubscriptionsPlan

-> Modèle SubscriptionsPlanhasManySuscriptions

Pour accéder au SubscriptionsPlan données dans un avantEnregistrer fonction dans le Abonnement modèle, vous feriez ce qui suit:

public function beforeSave($options = array()){ 
    $options = array(
     'conditions' => array(
      'SubscriptionsPlan.subscriptions_plan_id' => $this->data[$this->alias]['subscriptions_plan_id'] 
     ) 
    ); 

    $plan = $this->SubscriptionsPlan->find('first', $options); 

    //REST OF BEFORE SAVE CODE GOES HERE 
    return true; 
} 
0

Il devrait probablement travailler à l'aide d'une trouvaille à la place.

public function beforeSave($options) { 
    // Assuming your Product model is associated with your Quote model 
    $product = $this->Quote->Product->find('first', array(
     'conditions' => array(
      'Product.material_id' => $this->data['Quote']['material_id'] 
     ) 
    )); 
    $this->data['Quote']['material_id'] = $product['material_id']; 
    return true; 
} 
Questions connexes