/** * все сохранение делается внутри транзакции (включая beforeSave и afterSave), если будет исключение - транзакция будет откачена PDO */ public function save() { ActiveRecordHelper::exceptionIfObjectIsIncompatibleWithActiveRecord($this); $obj_class_name = get_class($this); $obj_db_id = $obj_class_name::DB_ID; $transaction_is_my = false; if (!DBWrapper::inTransaction($obj_db_id)) { DBWrapper::beginTransaction($obj_db_id); $transaction_is_my = true; } $this->beforeSave(); \OLOG\Model\ActiveRecordHelper::saveModelObj($this); // не вызываем afterSave если это вызов save для этого объекта изнутри aftersave этого же объекта (для предотвращения бесконечного рекурсивного вызова afterSave) static $__inprogress = []; $inprogress_key = FullObjectId::getFullObjectId($this); if (!array_key_exists($inprogress_key, $__inprogress)) { $__inprogress[$inprogress_key] = 1; $this->afterSave(); unset($__inprogress[$inprogress_key]); } // комитим только если мы же и стартовали транзакцию (на случай вложенных вызовов) if ($transaction_is_my) { DBWrapper::commitTransaction($obj_db_id); } }
public function delete() { ActiveRecordHelper::deleteModel($this); }
/** * все удаление делается внутри транзакции (включая canDelete и afterDelete), если будет исключение - транзакция будет откачена PDO */ public static function deleteModel($obj) { self::exceptionIfObjectIsIncompatibleWithActiveRecord($obj); $obj_class_name = get_class($obj); $obj_db_id = $obj_class_name::DB_ID; $transaction_is_my = false; if (!DBWrapper::inTransaction($obj_db_id)) { DBWrapper::beginTransaction($obj_db_id); $transaction_is_my = true; } $can_delete_message = ''; if ($obj instanceof \OLOG\Model\InterfaceDelete) { if (!$obj->canDelete($can_delete_message)) { if ($transaction_is_my) { DBWrapper::rollBackTransaction($obj_db_id); } throw new \Exception($can_delete_message); } } \OLOG\Model\ActiveRecordHelper::deleteModelObj($obj); if ($obj instanceof \OLOG\Model\InterfaceDelete) { $obj->afterDelete(); } if ($transaction_is_my) { DBWrapper::commitTransaction($obj_db_id); } }