2012-02-15 6 views
0

Я использую обратный вызов cakePHP 2.0 afterFind() для выполнения вычислений значений базы данных до их отображения.cakePHP afterFind и значения ассоциации

У меня есть три модели - материалы, продукты и котировки.

Каждый продукт имеет материал и расчеты выполняются в обратном вызове afterFind продукта, используя эту ассоциацию, в частности, с линией:

$results[$key]['Product']['material_cost'] = $results[$key]['Product']['material_mass'] * $val['Material']['cost']; 

с $val['Material']['cost'] со ссылкой на соответствующий материал.

Все в порядке.

Далее У меня есть обратный вызов afterFind() в моей модели Quote. Цитата связана с продуктом, и расчеты в модели кавычек зависят от расчетов в модели продукта, в частности, той, которая ссылается на материал.

Я могу сослаться на модель продукта afterfind результаты в цитате модели afterFind просто отлично, как: $val['Product']['number_tools']

Однако теперь модель продукта не может найти соответствующий материал, и я получаю сообщение об ошибке: Undefined индекс: Материал [APP /Model/Product.php, строка 126].
на линии 126 product.php является

$val['Material']['cost'] 

Как я могу обойти эту проблему, это сводит меня с ума!

+0

вообще, как правило, всегда хорошая идея, чтобы вычислить, что материал «по требованию» - незадолго до того, фактически выводя его , основное преимущество заключается в том, что эти вычисления не будут выполняться, если они не нужны, например. если происходит переадресация или если в представлении отображается только заголовок и т. д. – mark

+0

вычисления требуют больше или меньше всякий раз, когда запрашивается база данных, поэтому обратный вызов afterFind выполняет именно то, что я хочу, и выполняет вычисления «на лету», прежде чем данные будут отправлены в представление. - Плюс это позволяет мне сохранять всю логику в модели. – Ralphonz

ответ

0

Вам необходимо загрузить модель для Material. Причина, по которой вы можете получить к нему доступ из Продукта, связана с тем, что она связана с отношением, а ваш рекурсивный по умолчанию позволяет модели загружать связанные данные. Таким образом, в Quote модели метода beforeFind, прежде чем начать разбор через данные, загрузить материал Модель:

public function afterFind($results) { 

    App::uses('Material', 'Model'); 
    $material = new Material(); 
    $materials = $material->find(...); 

    foreach ($results as $key => $val) { 
     // access $materials['Material']['cost'] 
    } 
    return $results; 
} 
+0

Спасибо за ответ Чак. Это имеет смысл, за исключением того, что Product.php ищет модель материала, а не Quote.php. Цитата php связана с продуктом, поэтому вызывает функцию ProductFunction(), но бросает ошибку. Модель материала не доступна непосредственно из Quote.php. Как мне обойти это? – Ralphonz

+0

Может ли это быть ошибкой? Я заметил, что если я попытаюсь загрузить модель материалов в модели продукта с помощью вышеуказанного или ClassRegistry :: init («Материал») -> find() или даже $ materials = $ this-> Material-> findById (4) ; а затем получить доступ к нему из модели Quote. Я получаю фатальную ошибку: разрешенный размер памяти 134217728 байт исчерпан (пытался выделить 523800 байт) в – Ralphonz

+0

в качестве работы вокруг я связал Цитату с материалом и снова выполнил вычисления в Модель запроса, используя тест isset, чтобы остановить модель продукта, сбросив ошибку. Однако сейчас я нахожусь в другой проблеме, которая, вероятно, лучше всего оставить на другой вопрос. – Ralphonz

Смежные вопросы