symfony 1.4, $ this-> save () и триггеры вставки mysql - PullRequest
2 голосов
/ 27 октября 2011

У меня есть триггер на вставке, который обновляет код продукта в таблице на основе самого последнего кода клиента, сохраненного в другой таблице.

С Symfony и Propel я делаю следующее (обрезанные ненужные поля)

// actions.class.php
$lineitem = new LineItem();
$lineitem->setCustomerId( $customerId );

$thisProduct = ProductPeer::cacheProduct($orderDetails);
$lineitem->setCode($thisProduct->getCode()); // this should be fetching and setting the auto_code, inserted from the trigger.
$lineitem->save();

Функция cacheProduct (часть ProductPeer) ниже

// ProductPeer.php
// auto_code field in DB left blank, ready to be written to by the trigger
// cacheProduct function
public static function cacheProduct($orderDetails)
{
    $product = new Product();
    $product->setName( $orderDetails->getName() ); 
    $product->setCustomerCode( $orderDetails->getCustomerCode() );
    //$product->setCode(); // this will be set by the TRIGGER on insert.
    $product->save();

    return $product->getId();
}

Таким образом, проблема в том, что продукт вставляется, и триггер запускается успешно, но Symfony никогда не знает о недавно вставленном значении «код». При запуске свежего ProductPeer :: retrieveByPK () по-прежнему отображается пустое поле «код».

Таким образом, по сути, во всех точках $ lineitem-> getCode () возвращает ноль.

Я пытался обернуть это в транзакции, но в этом нет необходимости ... а также есть вероятность того, что это будет в цикле, и я не хочу многократно открывать и закрывать транзакции, если в этом нет крайней необходимости.

1) Когда фактически запускается триггер MYSQL ... $ xxx-> save () ? В конце сценария? 2) Как я могу получить доступ к этому значению после триггера, оставаясь в том же сценарии?

Решение найдено, спасибо :) Работа с Propel версии 1.4.8 или выше

1 Ответ

2 голосов
/ 27 октября 2011

Набор

reloadOnInsert="true"

в схеме таблицы и перестройте модель: Пример

(Имейте в виду, что это могло быть введено в более поздней версии Propel - проверьте версию вашего плагина Propel.)

...