CakePHP - доступ к связанной модели в beforeSave - PullRequest
0 голосов
/ 16 февраля 2012

В моем приложении котировки принадлежат продукту, который, в свою очередь, принадлежит материалу.Так как я не могу заставить массив продукта afterFind включать материал при обращении к нему из модели Quote, я связал его напрямую с материалом.

Проблема, с которой я столкнулся сейчас, заключается в том, что material_idпредложение должно быть автоматически сохранено на основе продукта, который выбран для предложения

, т. е. извлекает значение Product.material_id из выбранного продукта и сохраняет его в поле Quote.material_id автоматически добыл сохранен в базе данных.

Я совершенно новичок в cakePHP.Кто-нибудь знает, как это можно сделать?

РЕДАКТИРОВАТЬ:

Вот пример, чтобы помочь объяснить.В моей модели Quote у меня может быть:

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

, но мне нужно сделать что-то еще, что не работает:

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

Ответы [ 2 ]

3 голосов
/ 11 декабря 2013

Я в шоке, на этот вопрос еще не ответили должным образом ...

Ответ Oldskool является полукорректным, но не совсем правильным.Использование «$ this-> Quote» некорректно, так как сама функция beforeSave находится в классе Quote.Я объясню на примере.

-> У нас есть модель Подписка , которой принадлежит a ПодпискаПлан

-> Модель SubscriptionPlan hasMany Susptions

Для доступа к данным SubscriptionPlan в функции beforeSave в модели Subscription вы должны сделать следующее:

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 голосов
/ 16 февраля 2012

Вероятно, он должен работать, используя вместо этого поиск.

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