Doctrine - 如何在postSave()事件中获取SQL INSERT查询?

时间:2010-08-03 10:20:23

标签: php sql import doctrine

我希望在调用对象的save()方法时获得Doctrine生成的确切SQL INSERT查询。

最好,我想在模型的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文件来批量导入数据。

5 个答案:

答案 0 :(得分:1)

我认为没有任何简单的方法可以做到这一点,因为save()的行为因几个不同的东西(如果你正在插入/更新)而有所不同。

如果您已经创建了一个doctrine查询对象,那么可以像这样调用getSqlQuery()方法:

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

echo $q->getSqlQuery();

但save()是一个方法,而不是一个对象,所以这不起作用。我认为你必须破解一些代码来检测你是否正在插入或更新并构建一个查询以便即时登录然后使用save()。

我知道这个建议并不理想,因为它并没有“完全”记录save()正在做什么,但出于你声明的目的,它仍然可以正常工作。

答案 1 :(得分:0)

在这里查看:http://www.phpandstuff.com/articles/codeigniter-doctrine-scratch-day-8-hooks-profiling-dql,然后转到使用Doctrine进行概要分析创建Profiler Hook 部分。这是为了与CodeIgniter框架一起使用,它可以很容易地用于您自己的环境,因为代码与框架没有依赖关系。

您基本上想要设置一个Connection Profiler并让它将所有查询写入文件。我建议将所有查询附加到文件以获得更好的“日志”感觉。不要被文章中的许多框架谈话搞糊涂。这些示例在其他场景中运行得非常好(有一点理解,复制和粘贴)。

答案 2 :(得分:0)

您可以使用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

答案 3 :(得分:0)

为什么不试着看看symfony开发者是如何做到的?检查他们的WebDebug工具栏上的Doctrine here。 WebDebug工具栏输出您在页面上执行的所有查询。

DoctrineEvent上有一个钩子,我认为你可以修改代码来做你想做的事情。检查getDoctrineEventsgetSqlLogs方法。

希望这会有所帮助。如果您需要进一步说明,请在评论中写下,我会尽力解释。

答案 4 :(得分:-1)

您可以通过此函数将DQL查询转换为SQL:http://tokarchuk.ru/2010/12/dql-query-to-raw-sql/