PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Laravel eloquent - Gibt es eine Möglichkeit, Hint vor SELECT hinzuzufügen?

Sie können die Klasse PostgresConnection und die Klasse PostgresGrammar überschreiben, um Ihre eigene Logik zur Methode compileSelect in der Klasse PostgresGrammar hinzuzufügen.

class PostgresConnection extends \Illuminate\Database\PostgresConnection
{
    /**
     * @return \Illuminate\Database\Grammar|\Illuminate\Database\Query\Grammars\PostgresGrammar
     */
    protected function getDefaultQueryGrammar()
    {
        return $this->withTablePrefix(new PostgresGrammar());
    }
}
class PostgresGrammar extends \Illuminate\Database\Query\Grammars\PostgresGrammar
{
    /**
     * Compile a select query into SQL.
     *
     * @param  \Illuminate\Database\Query\Builder $query
     *
     * @return string
     */
    public function compileSelect(Builder $query)
    {
        $sql = parent::compileSelect($query);
        return '/*+ IndexScan(users) */' . $sql;
    }
}

Muss eine Dienstanbieterklasse definiert werden, ist es sehr wichtig, diesen Dienstanbieter vor Illuminate\Database\DatabaseServiceProvider::class

zu registrieren
class DatabasePostgresServiceProvider extends ServiceProvider
{
    /**
     * 此外,在 Illuminate\Database\DatabaseServiceProvider::class 之前注册此服务提供程序非常重要
     *
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Connection::resolverFor('postgres', function ($connection, $database, $prefix, $config) {
            // Use your own defined PostgresConnection class here.
            return new PostgresConnection($connection, $database, $prefix, $config);
        });
    }
}

Konfiguriert in config/app.php

'providers' => [
        // .... 
        DatabasePostgresServiceProvider::class,
        Illuminate\Database\DatabaseServiceProvider::class,

    ],