diff --git a/config/debugbar.php b/config/debugbar.php index 1d7440d43..445638691 100644 --- a/config/debugbar.php +++ b/config/debugbar.php @@ -225,6 +225,7 @@ 'memory_usage' => false, // Show queries memory usage 'soft_limit' => 100, // After the soft limit, no parameters/backtrace are captured 'hard_limit' => 500, // After the hard limit, queries are ignored + 'sort_condition' => 'execution_order', // Options (execution_order, alphabetical_order) ], 'mail' => [ 'timeline' => false, // Add mails to the timeline diff --git a/src/DataCollector/QueryCollector.php b/src/DataCollector/QueryCollector.php index 8da1b5264..896e0ceaf 100644 --- a/src/DataCollector/QueryCollector.php +++ b/src/DataCollector/QueryCollector.php @@ -27,6 +27,7 @@ class QueryCollector extends PDOCollector protected $explainTypes = ['SELECT']; // ['SELECT', 'INSERT', 'UPDATE', 'DELETE']; for MySQL 5.6.3+ protected $showHints = false; protected $showCopyButton = false; + protected $sortCondition = 'execution_order'; protected $reflection = []; protected $backtraceExcludePaths = [ '/vendor/laravel/framework/src/Illuminate/Support', @@ -87,6 +88,16 @@ public function setShowCopyButton($enabled = true) $this->showCopyButton = $enabled; } + /** + * Determine how the queries are sorted. + * + * @param string $sortCondition + */ + public function setSortCondition($sortCondition = 'execution_order') + { + $this->sortCondition = $sortCondition; + } + /** * Enable/disable finding the source * @@ -194,6 +205,14 @@ public function addQuery($query) 'show_copy' => $this->showCopyButton, ]; + if ($this->sortCondition === 'alphabetical_order') { + usort($this->queries, function (array $queryOne, array $queryTwo) { + $queryOneTableName = substr($queryOne['query'], stripos($queryOne['query'], "from") + 4); + $queryTwoTableName = substr($queryTwo['query'], stripos($queryTwo['query'], "from") + 4); + return (int)($queryOneTableName > $queryTwoTableName); + }); + } + if ($this->timeCollector !== null) { $this->timeCollector->addMeasure(Str::limit($sql, 100), $startTime, $endTime, [], 'db'); } diff --git a/src/LaravelDebugbar.php b/src/LaravelDebugbar.php index 618fc8d04..d141cff72 100644 --- a/src/LaravelDebugbar.php +++ b/src/LaravelDebugbar.php @@ -325,6 +325,10 @@ function (\Illuminate\Log\Events\MessageLogged $log) use ($logger) { $queryCollector->setShowCopyButton(true); } + if ($sort = $config->get('debugbar.options.db.sort_condition', 'execution_order')) { + $queryCollector->setSortCondition($sort); + } + $this->addCollector($queryCollector); try { diff --git a/tests/DataCollector/QueryCollectorTest.php b/tests/DataCollector/QueryCollectorTest.php index 11cd3015b..ca5d1c17e 100644 --- a/tests/DataCollector/QueryCollectorTest.php +++ b/tests/DataCollector/QueryCollectorTest.php @@ -85,4 +85,36 @@ public function testFindingCorrectPathForView() ); }); } + + public function testWillSortByAlphabeticalOrderOfTableName() + { + debugbar()->boot(); + + /** @var \Barryvdh\Debugbar\DataCollector\QueryCollector $collector */ + $collector = debugbar()->getCollector('queries'); + $collector->setSortCondition('alphabetical_order'); + $collector->addQuery(new QueryExecuted( + "SELECT a FROM c WHERE b = ?", + ['1'], + 0, + $this->app['db']->connection() + )); + $collector->addQuery(new QueryExecuted( + "SELECT b FROM a WHERE c = ?", + ['2'], + 0, + $this->app['db']->connection() + )); + $collector->addQuery(new QueryExecuted( + "SELECT a FROM b WHERE c = ?", + ['3'], + 0, + $this->app['db']->connection() + )); + + $statements = $collector->collect()['statements']; + $this->assertEquals("SELECT b FROM a WHERE c = '2'", $statements[0]['sql']); + $this->assertEquals("SELECT a FROM b WHERE c = '3'", $statements[1]['sql']); + $this->assertEquals("SELECT a FROM c WHERE b = '1'", $statements[2]['sql']); + } }