У меня есть триггер на вставке, который обновляет код продукта в таблице на основе самого последнего кода клиента, сохраненного в другой таблице.
С 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 или выше