b2pweb / bdf-prime-analyzer
分析Prime ORM生成的查询,并输出不安全或未优化的查询
v1.0.3
2024-02-27 08:31 UTC
Requires
- php: ~7.1 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0
- ext-json: *
- b2pweb/bdf-collections: ~1.1.2
- b2pweb/bdf-prime: ~1.0|^2.0.5
Requires (Dev)
- phpunit/phpunit: ~7.0|~8.0
- vimeo/psalm: ~4.7
Suggests
- b2p/bdf-web: For use service provider (~1.8)
Conflicts
README
分析运行时执行的查询,报告可疑查询或优化提示。
用法
使用composer安装
composer require --dev b2p/bdf-prime-analyzer
在单元测试用例中注册
public static function createApplication() { $app = require __DIR__ . '/../../app/application.php'; // ... $app->register(new \Bdf\Prime\Analyzer\PrimeAnalyzerServiceProvider([ 'ignoredPath' => [dirname(__DIR__)], 'dumpFormats' => [ new \Bdf\Prime\Analyzer\Testing\DumpFormat\HtmlDumpFormat(__DIR__.'/prime-report.html'), new \Bdf\Prime\Analyzer\Testing\DumpFormat\ConsoleDumpFormat(), ], 'ignoredAnalysis' => [], ])); // ... return $app; }
要忽略单个查询的分析,在执行行简单添加 @prime-analyzer-ignore [analisys]
标签。
$credentials = $device->relation('credentials')->first(); // @prime-analyzer-ignore optimisation sort
您也可以在全局上忽略实体的分析,使用Mapper类的docblock。与查询内联忽略不同,参数可以设置为仅忽略列出的属性。
/** * Mapper for TourOperation * * @prime-analyzer-ignore sort position * @prime-analyzer-ignore not_declared my_raw_attribute * @prime-analyzer-ignore index */ class TourOperationMapper extends Mapper { // ... }
选项
在服务提供商注册上可设置的可用选项
- ignoredPath : 忽略查询分析中的路径列表。例如,测试目录。
- ignoredAnalysis : 忽略的分析列表。见AnalysisTypes。可以使用AnalysisTypes::optimisations()仅报告危险查询。
- dumpFormats : DumpFormatInterface实例列表。
- ConsoleDumpFormat : 测试结束后在控制台进行转储
- HtmlDumpFormat : 转储到HTML文件
- register : 设置为false以禁用报告
分析
- like : 分析LIKE过滤器,并转储没有通配符_或%的值。
- index : 转储没有索引的查询。至少有一个关系或连接的查询被忽略。
- not_declared : 转储未声明的属性的使用(即不在mapper中的属性)。
- sort : 转储具有非索引属性上的ORDER子句的查询。如果返回集很小,可以忽略这些报告。
- or : 转储没有嵌套在括号中的OR子句的查询。
- optimisation : 转储可以使用KeyValueQuery或findById进行优化的查询。有关更多信息,请参阅限制。
- relation_distant_key : 转储使用关系的远程键而不是本地键的查询。这会导致无用的连接。不要处理"通过"关系。
- write : 转储无效的更新或插入查询。分析未声明的属性和值类型。
- n+1 : 转储N+1或循环查询。要引发N+1,查询必须至少调用两次,并且具有相同的堆栈跟踪。仅在循环是所需的情况下忽略(如walker)。
限制
- 不处理原始表达式或连接。
- optimisation 可能会在关系查询上生成报告,这无法修复,应忽略。
- n+1 在同一实体上加载两个关系(例如,$orderCustomer.load(['lading', 'delivery']))的情况下可能报告假阳性。
- 始终验证索引。索引分析不代替 EXPLAIN。