phpcodemaker / cake-debug-query

CakePHP 查询调试器

v1.0.1 2021-05-30 08:54 UTC

This package is auto-updated.

Last update: 2024-09-29 05:29:21 UTC


README

CakePHP 中调试查询

这是一个开发支持代码,而不是完整的包。src 文件夹下的 Query.php 类中的方法可以复制到 /vendor/cakephp/cakephp/src/Database/Query.php 类。

注意

如果 CakePHP 数据库查询有新的更新,您所做的更改将丢失。

依赖关系

确保此 debugQuery($formatSQL = true) 方法在 vendor 中有依赖项 jdorn/sql-formatter。您可以使用此链接安装此依赖项:https://github.com/jdorn/sql-formatter

如何在代码中使用?

将 debugQuery($formatSQL = true) 方法放置在以下文件内部

<!-- language: php -->
public function debugQuery($formatSQL = true): string  
{  
	  $query = $this->sql();  
	  $placeholderArray = $this->getValueBinder()->bindings();  
	  if (null != $placeholderArray) {  
		  foreach ($placeholderArray as $placeholder => $paramArray) {  
			  switch ($paramArray['type']) {  
				  case 'json' :  
					  $QueryParam[substr($placeholder, 1)] = '\'' . json_encode($paramArray['value'], JSON_NUMERIC_CHECK) . '\'';  
					  break; case 'boolean':  
				  case 'integer':  
					  $QueryParam[substr($placeholder, 1)] = $paramArray['value'];  
					  break;
				  case 'string':  
				  case 'text' :  
				  default :  
					  $QueryParam[substr($placeholder, 1)] = "'{$paramArray['value']}'";  
					  break;
		     }  
		 }
	  }
	  $outputQuery = $query;  
	  if (!empty($QueryParam)) {  
		  $outputQuery = \Cake\Utility\Text::insert($query, $QueryParam);  
	  }  
	  return $formatSQL ? \SqlFormatter::format($outputQuery) : $outputQuery;  
}

`

控制器内带有格式化视图的 SQL
<!-- language: php -->
$this->loadModel('Model);  
print $this->Model  
		 ->find()
		 ->select(["select_column"])
		 ->where(["user_id" => 1])
		 ->debugQuery()

[输出]

SELECT  
    Panels.panel AS Panels__panel,  
    Panels.element AS Panels__element  
FROM  
    panels Panels  
控制器内无格式化视图的 SQL
<!-- language: php -->
$this->loadModel('Model);  
$this->Model
	 ->find()
	 ->select(["select_column"])
	 ->where(["user_id" => 1])
	 ->debugQuery(false)

[输出]

SELECT Panels.panel AS Panels__panel, Panels.element AS Panels__element FROM panels Panels  

[注意]
在 Web 上使用 dd(),以及 CLI 用于调试目的时,使用 formatSQL 标志 false,如下所示,
否则 debugQuery 返回 HTML,您将无法以可读的格式看到 SQL。

dd($this->Model->find()->where()->debugQuery(false));