Я хотел бы получить точный запрос SQL INSERT, который генерирует Doctrine, когда вызывается метод save () объекта.
Предпочтительно, я хотел бы получить его в postSave () событии модели и зарегистрировать его в txt-файле.
Например:
<?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');
Предпосылкой для этого является то, что я хочу массово импортировать данные путем анализа файла txt.
Я не думаю, что есть простой способ сделать это, поскольку поведение save () зависит от нескольких разных вещей (если вы вставляете / обновляете).
Если вы создали объект запроса doctrine, вы можете вызвать метод getSqlQuery () следующим образом:
$q = Doctrine_Query::create() ->select('u.id') ->from('User u'); echo $q->getSqlQuery();
но save () – это метод, а не объект, поэтому это не сработает. Я думаю, вам придется взломать код, чтобы определить, вставляете ли вы или обновляете и строите запрос для входа на лету, а затем используйте save ().
Я знаю, что это предложение не идеально, потому что оно не записывает «точно», что делает save (), но для тех целей, о которых вы заявили, он все равно должен работать так же хорошо.
Взгляните сюда: http://www.phpandstuff.com/articles/codeigniter-doctrine-scratch-day-8-hooks-profiling-dql и перейдите в раздел « Профилирование с доктриной» и « Создание крючка профайлера» . Несмотря на это, для использования с каркасом CodeIgniter, его можно легко адаптировать к вашей собственной среде, поскольку код не имеет зависимостей от структуры.
В основном вы хотите настроить Profiler Connection и позволить ему записывать все запросы в файл. Я предлагаю добавить все запросы к файлу, чтобы иметь лучшее «логарифмическое» чувство. Не путайте многие рамочные обсуждения внутри статей. Примеры работают очень хорошо (с небольшим пониманием и копированием и вставкой) в других сценариях.
вы можете использовать профилировщик из класса 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
Почему бы вам не попробовать, как это делают разработчики symfony? Проверьте их панель инструментов WebDebug для Doctrine здесь . Панель инструментов WebDebug выводит весь запрос, который вы делаете на странице.
На DoctrineEvent
есть крючок, и я думаю, вы можете изменить код, чтобы делать то, что хотите. Проверьте метод getDoctrineEvents
и getSqlLogs
.
Надеюсь это поможет. Если вам нужно дополнительное объяснение, напишите его в комментарии, я постараюсь изо всех сил объяснить.
Вы можете преобразовать DQL-запрос в SQL с помощью этой функции: http://tokarchuk.ru/2010/12/dql-query-to-raw-sql/