私はZend FrameworkでMySQLを使用しています&Doctrine 2。Doctrine 2を使用しなくても、次のようなエラーに慣れると思います
SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ASC' at line 1
問題は、完全なクエリが表示されないことです。 ORMフレームワークがなければ、おそらくSQLを簡単にエコーできますが、フレームワークを使用して、実行しようとしているSQLをどのようにして見つけることができますか?エラーを以下に絞り込みました
$progress = $task->getProgress();
$progress
が宣言されています
// Application\Models\Task
/**
* @OneToMany(targetEntity="TaskProgress", mappedBy="task")
* @OrderBy({"seq" = "ASC"})
*/
protected $progress;
MySQLでは、タスククラスは次のようになります。
CREATE TABLE `tasks` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`owner_id` int(11) DEFAULT NULL,
`assigned_id` int(11) DEFAULT NULL,
`list_id` int(11) DEFAULT NULL,
`name` varchar(60) NOT NULL,
`seq` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `tasks_owner_id_idx` (`owner_id`),
KEY `tasks_assigned_id_idx` (`assigned_id`),
KEY `tasks_list_id_idx` (`list_id`),
CONSTRAINT `tasks_ibfk_1` FOREIGN KEY (`owner_id`) REFERENCES `users` (`id`),
CONSTRAINT `tasks_ibfk_2` FOREIGN KEY (`assigned_id`) REFERENCES `users` (`id`),
CONSTRAINT `tasks_ibfk_3` FOREIGN KEY (`list_id`) REFERENCES `lists` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1$$
mysql一般クエリログ を使用するのはどうですか?
一般クエリログは、mysqldが実行していることの一般的な記録です。サーバーは、クライアントが接続または切断したときにこのログに情報を書き込み、クライアントから受信した各SQLステートメントをログに記録します。一般的なクエリログは、クライアントのエラーが疑われ、クライアントがmysqldに送信したものを正確に知りたい場合に非常に役立ちます。
Doctrine 2でクエリをデバッグするための最も簡単なソリューション:
$em->getConnection()
->getConfiguration()
->setSQLLogger(new \Doctrine\DBAL\Logging\EchoSQLLogger())
;
DBAL SQLLoggerを使用する必要があります。基本的なネイティブSQLロガー\ Doctrine\DBAL\Logging\EchoSQLLoggerを使用するか、またはDoctrine\DBAL\Logging\SQLLoggerのインターフェイスを使用して独自のSQLロガーを実装できます。
基本的なロガーの場合、SQLロガーをEntityManagerにアタッチする必要があります。したがって、あなたのDoctrine bootstrapファイルの使用:
$config = new Doctrine\ORM\Configuration ();
// ... config stuff
$config->setSQLLogger(new \Doctrine\DBAL\Logging\EchoSQLLogger());
$connectionParams = array(
'dbname' => 'example',
'user' => 'example',
'password' => 'example',
'Host' => 'localhost',
'driver' => 'pdo_mysql');
//make the connection through an Array of params ($connectionParams)
$em = EntityManager::create($connectionParams, $config);
$ connectionParams配列からEntityManagerを作成することに注意してください。
重要:。 EntityManagerの作成にDBAL接続を使用する場合は、DBAL接続とORM EntityManagerの両方に接続する必要があります。たとえば、Zend Frameworkでは、
これをして:
$config = new Doctrine\ORM\Configuration ();
// ...config stuff
// LOGGER
$config->setSQLLogger(new \Doctrine\DBAL\Logging\EchoSQLLogger());
// make the connection through DBAL (DriverManager::getConnection)
// note that we attach $config in $connApp(DBAL) and $emApp(ORM)
$connApp = DriverManager::getConnection($connectionParams, $config);
$emApp = EntityManager::create($connApp, $config);
Zend_Registry::set('emApp', $emApp);
Zend_Registry::set('connApp', $connApp);
Doctrine2プロファイラー+ Firebugを使用する
このトピックに関するブログ記事を書き、プロファイリングをセットアップするためのいくつかの手順を示しましたDoctrine 2 Zend Frameworkで
ZFDebugはすでに非常に優れており、Doctrine 2のプラグインがあります。
http://labs.ultravioletdesign.co.uk/profiling-doctrine-2-with-zend-framework/
あなたとMySQLサーバーの間でMysqlプロキシを使用してみてください( http://forge.mysql.com/wiki/MySQL_Proxy )。次に、すべての要求をログに記録するようにこのプロキシを構成できます。
http://mysql.stu.edu.tw/tech-resources/articles/proxy-gettingstarted.html
ZF2で開発している場合は、beberleiによって投稿された上記のソリューションを使用できますが、これはディスプレイにエコー出力しますが、これは正確にはベストプラクティスではありませんが、有用。
$em->getConnection()
->getConfiguration()
->setSQLLogger(new \Doctrine\DBAL\Logging\EchoSQLLogger())
;
または、ツールバーに実行クエリを表示する ZendDeveloperTools を使用することもできます。
Zend_Db_Profileを[開発]環境で使用する必要があるかもしれません。
これにより、ランタイムとその他の情報を使用してクエリがログに記録されます。
例外を記録するエラーログがある場合、すべてがログファイルにあります。
このリンクを参照してください: Zend Enable SQL Query logging
このZend Framework Helperも参照してください: https://github.com/jokkedk/ZFDebug