【发布时间】:2021-06-06 12:01:17
【问题描述】:
我使用一个大型 RDS 数据库实例,该实例在几个不同的项目(确切地说不是微服务)之间共享,并且该数据库的性能至关重要。因此,每当支持团队提出与我们服务性能相关的票证时,我都会监控查询。因此,为了让我跟踪每个查询的来源,即哪个应用程序、文件和行号,我想为所有查询自动添加 SQL 注释。因此,当我在查询构建器对象上调用 toSql() 时,它必须向我显示注释
-- lumen-api:app/Http/Controllers/APIController.php:85
select * from users;
env(app_name) . ':'. __FILE__ . ':' . __LINE__.
我尝试扩展查询构建器和语法类并将它们绑定到服务容器,但我认为我做错了什么。请看一下我如何扩展这些类的实现。
<?php
// app/Classes/Database/Query/Grammars/QueryGrammar.php
namespace App\Classes\Database\Query\Grammars;
use App\Classes\Database\Query\QueryBuilder;
use Illuminate\Database\Query\Grammars\Grammar;
class QueryGrammar extends Grammar
{
/**
* @param QueryBuilder $query
* @param $comment
* @return string
*/
public function compileComment(QueryBuilder $query, $comment)
{
$this->selectComponents[] = 'comment';
return '-- ' . $comment . PHP_EOL;
}
}
<?php
// app/Classes/Database/Query/QueryBuilder.php
<?php
namespace App\Classes\Database\Query;
use Illuminate\Database\Query\Builder;
class QueryBuilder extends Builder {
/**
* @param $comment
* @return $this
*/
public function comment($comment): QueryBuilder
{
$this->comment = $comment;
return $this;
}
}
<?php
//app/Providers/AppServiceProvider.php
<?php
namespace App\Providers;
use App\Classes\Database\Query\Grammars\QueryGrammar;
use App\Classes\Database\Query\QueryBuilder;
use Illuminate\Database\ConnectionInterface;
use Illuminate\Database\Query\Builder;
use Illuminate\Database\Query\Grammars\Grammar;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*
* @return void
*/
public function register()
{
/**
* Extending Query Builder to support SQL comments
*/
$this->app->bind(Grammar::class, function () {
return new QueryGrammar();
});
$this->app->bind(Builder::class, function () {
return new QueryBuilder(/* how to send params?*/);
});
}
}
我知道这个实现不是为了自动添加 sql cmets。所以当我在我的控制器中使用它时:
return Admin::where('login_email','bhargav.nanekalva@mpokket.com')->comment(__FILE__ . __LINE__)->toSql();
Laravel 抛出以下错误:(这意味着绑定没有发生)
(1/1) BadMethodCallException
Call to undefined method Illuminate\Database\Eloquent\Builder::comment()
我需要帮助是为了
- 修改这些类的正确方法
- 自动添加sql注释
【问题讨论】:
-
你想要Mysql的解决方案?
-
@Vinay 当然可以。但只是好奇,为什么我们不能有一个适用于任何数据库的通用解决方案?
标签: php mysql laravel amazon-rds lumen-5.8