Доктрина - как получить запрос SQL INSERT, в событии postSave ()? - PullRequest
7 голосов
/ 03 августа 2010

Я хотел бы получить точный запрос SQL INSERT, который Doctrine генерирует при вызове метода save () объекта.

Предпочтительно, я хотел бы получить его в событии postSave () модели и записать его в текстовый файл.

Например:

<?php 
$user = new User(); // A Doctrine Model with timestampable behavior enabled
$user->first_name = 'Manny';
$user->last_name = 'Calavera';
$user->save();
?>

Я хочу получить / записать следующий SQL-запрос:

INSERT INTO user (first_name, last_name, created_at, updated_at) VALUES ('Manny', 'Calavera', '2010-08-03 12:00:00', '2010-08-03 12:00:00');

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

Ответы [ 5 ]

1 голос
/ 06 августа 2011

Почему бы вам не попытаться увидеть, как разработчики Symfony делают это? Проверьте их панель инструментов WebDebug для Doctrine здесь . Панель инструментов WebDebug выводит все запросы, которые вы делаете на странице.

Есть хук на DoctrineEvent, и я думаю, что вы можете изменить код, чтобы сделать то, что вы хотите. Проверьте метод getDoctrineEvents и getSqlLogs.

Надеюсь, это поможет. Если вам нужно дальнейшее объяснение, пожалуйста, напишите это в комментарии, я постараюсь объяснить.

1 голос
/ 03 августа 2010

Я не думаю, что существует какой-либо простой способ сделать это, поскольку поведение save () зависит от нескольких разных вещей (если вы вставляете / обновляете).

Если вы создали объект запроса доктрины, вы можете вызвать метод getSqlQuery () следующим образом:

$q = Doctrine_Query::create()
->select('u.id')
->from('User u');

echo $q->getSqlQuery();

но save () - это метод, а не объект, поэтому это не сработает. Я думаю, вам придется взломать некоторый код, чтобы определить, вставляете ли вы или обновляете, и создать запрос для входа на лету, а затем использовать save ().

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

0 голосов
/ 07 января 2011

вы можете использовать профилировщик из класса sfDoctrineDatabase.Используйте getQueryExecutionEvents для захвата всех запросов.

$databaseManager = sfContext::getInstance()->getDatabaseManager();
if ($databaseManager) {
    foreach ($databaseManager->getNames() as $name) {
        $database = $databaseManager->getDatabase($name);
        if ($database instanceof sfDoctrineDatabase && $profiler = $database->getProfiler()) {
            foreach ($profiler->getQueryExecutionEvents() as $event) {
                $conn = $event->getInvoker() instanceof Doctrine_Connection ? $event->getInvoker() : $event->getInvoker()->getConnection();
                $params = sfDoctrineConnectionProfiler::fixParams($event->getParams());
                $query = $event->getQuery() ;

                foreach ($params as $param) {
                    $param = htmlspecialchars($param, ENT_QUOTES, sfConfig::get('sf_charset'));
                    $query = join(var_export(is_scalar($param) ? $param : (string) $param, true), explode('?', $query, 2));
                }
                // log the $query here, or use the symfony's logger
                // sfContext::getInstance()->getLogger()->debug(sprintf('Query Run !! %s ', $query));
            }
        }
    }
}

не забудьте объединить запрос с параметрами (чтобы он заменил? На значения)

: D

0 голосов
/ 03 декабря 2010

Вы можете конвертировать ваш DQL-запрос в SQL с помощью этой функции: http://tokarchuk.ru/2010/12/dql-query-to-raw-sql/

0 голосов
/ 03 августа 2010

Посмотрите здесь: http://www.phpandstuff.com/articles/codeigniter-doctrine-scratch-day-8-hooks-profiling-dql и перейдите к разделу, озаглавленному Профилирование с помощью Doctrine и Создание крюка профилировщика . Хотя это и предназначено для использования с платформой CodeIgniter, ее можно легко адаптировать к вашей собственной среде, поскольку код не имеет зависимостей от каркаса.

Вы в основном хотите настроить Профилировщик соединений и позволить ему записывать все запросы в файл. Я предлагаю добавлять все запросы к файлу, чтобы они лучше воспринимались как журнал. Не запутайтесь в разговорах о фреймворке внутри статей. Примеры работают очень хорошо (с небольшим пониманием, копированием и вставкой) в других сценариях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...