Question

In my app Quotes belongTo a product, which in turn belongs to a material. As I can't get the product model afterFind array to include the material when it is accessed from the Quote model I have associated the Quote directly with a material.

The problem I'm having now is that the material_id for the quote needs to be automatically saved based on the product which is selected for the quote

i.e. pulling the value of Product.material_id from the selected product and saving it to the Quote.material_id field automatically before the Quote has been saved to the database.

I'm quite new to cakePHP. Does anyone know how this can be done?

EDIT:

Here is an example to help explain. In my Quote model i can have:

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

but i need to do something more like this which doesn't work:

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

Solution

I'm shocked this hasn't been properly answered yet....

Oldskool's response is semi-correct, but not entirely right. The use of "$this->Quote" is incorrect, as the beforeSave function itself resides in the Quote class. I'll explain using an example.

-> We have a model Subscription which belongsTo a SubscriptionsPlan

-> Model SubscriptionsPlan hasMany Suscriptions

To access the SubscriptionsPlan data in a beforeSave function in the Subscription model, you would do the following:

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;
}

OTHER TIPS

It should probably work by using a find instead.

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;
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top