27

Zend Framework と Doctrine 2 で MySQL を使用しています。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$$
4

8 に答える 8

93

Doctrine 2 でクエリをデバッグするための最も簡単なソリューション:

$em->getConnection()
  ->getConfiguration()
  ->setSQLLogger(new \Doctrine\DBAL\Logging\EchoSQLLogger())
;
于 2011-01-03T14:51:05.490 に答える
13

DBAL SQLLogger を使用する必要があります。基本的なネイティブ SQL Logger \Doctrine\DBAL\Logging\EchoSQLLoggerを使用するか、 Doctrine\DBAL\Logging\SQLLoggerのインターフェースを使用して独自のものを実装できます。

基本ロガーの場合、SQL ロガーを EntityManager にアタッチする必要があります。したがって、Doctrine ブートストラップ ファイルで次のように使用します。

$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 フレームワークでは、

これをして:

$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);
于 2011-11-14T20:43:35.613 に答える
6

mysql の一般的なクエリ ログを使用するのはどうですか?

一般的なクエリ ログは、mysqld が行っていることの一般的な記録です。クライアントが接続または切断すると、サーバーはこのログに情報を書き込み、クライアントから受信した各 SQL ステートメントをログに記録します。一般的なクエリ ログは、クライアントでエラーが発生した疑いがあり、クライアントが mysqld に送信した内容を正確に知りたい場合に非常に役立ちます。

于 2010-12-31T15:03:18.310 に答える
5

Doctrine2 プロファイラー + Firebug を使用する

https://github.com/mridgway/ZendX_Doctrine2/

于 2011-01-01T06:53:31.430 に答える
2

あなたと MySQL サーバーの間で Mysql プロキシを使用してみてください ( http://forge.mysql.com/wiki/MySQL_Proxy )。次に、すべてのリクエストをログに記録するようにこのプロキシを構成できます。

http://mysql.stu.edu.tw/tech-resources/articles/proxy-gettingstarted.html

于 2010-12-31T14:53:52.737 に答える
2

ZF2 で開発している場合は、 beberlei によって投稿された上記のソリューションを使用できますがこれはディスプレイに反映されますが、これは正確なベスト プラクティスではありませんが便利です。

$em->getConnection()
  ->getConfiguration()
  ->setSQLLogger(new \Doctrine\DBAL\Logging\EchoSQLLogger())
;

または、実行クエリをツールバーに表示するZendDeveloperToolsを使用することもできます。

ここに画像の説明を入力

于 2014-05-06T17:55:44.843 に答える
2

Zend Framework でプロファイリング Doctrine 2 をセットアップするためのいくつかの手順を含む、このトピックに関するブログ記事を書きました。

ZFDebug はすでに非常に優れており、そのための Doctrine 2 プラグインがあります。

http://labs.ultravioletdesign.co.uk/profiling-doctrine-2-with-zend-framework/

于 2011-12-01T16:50:14.273 に答える