Obter a consulta executada no Laravel 3/4


182

Como recuperar a consulta SQL executada bruta no Laravel 3/4 usando o Laravel Query Builder ou Eloquent ORM?

Por exemplo, algo como isto:

DB::table('users')->where_status(1)->get();

Ou:

(posts (id, user_id, ...))

User::find(1)->posts->get();

Caso contrário, no mínimo, como posso salvar todas as consultas executadas no laravel.log?


e no laravel 5?
Chaudhry Waqas

Respostas:


318

Laravel 4+

No Laravel 4 e posterior, você precisa ligar DB::getQueryLog()para obter todas as consultas executadas.

$queries = DB::getQueryLog();
$last_query = end($queries);

Ou você pode baixar um pacote de criação de perfil. Eu recomendaria barryvdh / laravel-debugbar , o que é bastante legal. Você pode ler para obter instruções sobre como instalar em seu repositório .

Nota para usuários do Laravel 5: você precisará ligar DB::enableQueryLog()antes de executar a consulta. Logo acima da linha que executa a consulta ou dentro de um middleware.


Laravel 3

No Laravel 3, você pode obter a última consulta executada de um Eloquentmodelo que chama o método estático last_queryna DBclasse.

DB::last_query();

Isso, no entanto, requer que você ative a profileropção application/config/database.php. Como alternativa, você pode, como mencionado anteriormente, ativar a profileropção entrar application/config/application.phpou ligar DB::profile()para que todas as consultas sejam executadas na solicitação atual e no tempo de execução.


2
Seu código para o Laravel 4 não funciona. Entendi ErrorException: Aviso: call_user_func_array()espera que o parâmetro 1 seja um retorno de chamada válido, a classe Illuminate\Database\MySqlConnectionnão tem um método getQueryList.
duality_

Meu mal, o método correto é getQueryLog. Corrigido agora. Obrigado!
Rmobis

Estranho ... recebo last_query () não está definido no erro do objeto Query. Estou apenas chamando um modelo Eloquent não instanciado.
Aditya MP

1
Para o Laravel 3, na verdade, é DB :: last_query (); Você também precisa set 'perfil' para true em seu application / config / database.php
Dan Inteligente

4
Isso não parece funcionar para um modelo eloquente no L4. Quando executo Model :: find ($ id) e executo DB :: getQueryLog (), retorne array em branco (). Alguma idéia de como obter as consultas para um modelo eloquente?
Abishek

31

Você pode ativar o " Profiler " no Laravel 3 configurando

'profiler' => true,

No seu application/config/application.phpeapplication/config/database.php

Isso permite uma barra na parte inferior de cada página. Uma de suas características é listar as consultas executadas e quanto tempo cada uma delas levou.

insira a descrição da imagem aqui


14
Observe que no Laravel 4, o Profiler não está incluído, você deve instalá-lo sozinho (por exemplo, usando o compositor). Veja esta pergunta SO .
duality_

1
É discutido na primeira resposta lá .
duality_

24

Para o Eloquent, você pode apenas fazer:

$result->getQuery()->toSql();

Mas você precisa remover a parte "-> get ()" da sua consulta.


17

Eu recomendaria o uso da extensão Clockwork do Chrome com o pacote Laravel https://github.com/itsgoingd/clockwork . É fácil de instalar e usar.

Clockwork é uma extensão do Chrome para desenvolvimento PHP, estendendo as Ferramentas do desenvolvedor com um novo painel que fornece todos os tipos de informações úteis para depuração e criação de perfil dos scripts PHP, incluindo informações sob solicitação, cabeçalhos, dados GET e POST, cookies, dados da sessão, consultas ao banco de dados, rotas, visualização do tempo de execução do aplicativo e muito mais. O Clockwork inclui suporte pronto para uso para aplicativos baseados no Laravel 4 e Slim 2, você pode adicionar suporte para qualquer outra estrutura personalizada ou através de uma API extensível.

insira a descrição da imagem aqui


16

Como o criador de perfil ainda não saiu do Laravel 4 , criei esta função auxiliar para ver o SQL sendo gerado:

    função estática pública q ($ all = true) 
    {
        $ consultas = DB :: getQueryLog ();

        if ($ all == false) {
            $ last_query = end ($ consultas);
            retorne $ last_query;
        }

        retornar $ consultas;
    }

NOTA : Defina o sinalizador $ all como false se você quiser apenas a última consulta SQL.

Eu mantenho esse tipo de função em uma classe chamada DBH.php (abreviação de Database Helper) para que eu possa chamá-lo de qualquer lugar como este:

dd(DBH::q()); 

Aqui está a saída que recebo: insira a descrição da imagem aqui

Caso você esteja se perguntando, eu uso o Kint para a formatação dd (). http://raveren.github.io/kint/


1
if($all == false)? Por que não simplesmenteif(!$all)
toesslab


14

Aqui está um snippet rápido de Javascript que você pode lançar no seu modelo de página principal. Desde que incluído, todas as consultas serão exibidas no console Javascript do seu navegador. Ele os imprime em uma lista de fácil leitura, facilitando a navegação pelo site e ver quais consultas estão sendo executadas em cada página.

Quando você terminar de depurar, basta removê-lo do seu modelo.

<script type="text/javascript">
    var queries = {{ json_encode(DB::getQueryLog()) }};
    console.log('/****************************** Database Queries ******************************/');
    console.log(' ');
    queries.forEach(function(query) {
        console.log('   ' + query.time + ' | ' + query.query + ' | ' + query.bindings[0]);
    });
    console.log(' ');
    console.log('/****************************** End Queries ***********************************/');
</script>

Eu acho que você precisa "" em torno da {{json_encode ...}} parte
mydoglixu

@mydoglixu Desde que DB::getQueryLog()retorna uma matriz, não há necessidade de cercá-la com "". json_encodeirá traduzi-lo de acordo.
Rmobis

@mobis - quis dizer que você precisa do "" fora do {{...}} para que o javascript não gere um erro. assim: var queries = "json output";
mydoglixu

@mydoglixu Você não, porque uma matriz JSON (ou objeto) é JavaScript válido. Quebraria se você fizesse.
Rmobis 01/07/2015

@mobis - oh yeah, duh
mydoglixu

10

Laravel 5

Observe que esta é a abordagem processual , que eu uso para depuração rápida

    DB::enableQueryLog();

    // Run your queries
    // ...

    // Then to retrieve everything since you enabled the logging:
    $queries = DB::getQueryLog();
    foreach($queries as $i=>$query)
    {
        Log::debug("Query $i: " . json_encode($query));
    }

no seu cabeçalho, use:

     use DB;
     use Illuminate\Support\Facades\Log;

A saída será mais ou menos assim (o arquivo de log padrão é laravel.log ):

[2015-09-25 12:33:29] testing.DEBUG: Consulta 0: {"query": "selecione * de 'usuários' onde ('user_id' =?)", "Ligações": ["9"] , "hora": 0,23}

*** Eu sei que esta pergunta especificou o Laravel 3/4, mas esta página aparece ao procurar uma resposta geral. Os iniciantes no Laravel podem não saber que há uma diferença entre as versões. Como eu nunca vi DD::enableQueryLog()mencionado em nenhuma das respostas que normalmente encontro, pode ser específico para o Laravel 5 - talvez alguém possa comentar sobre isso.


7

Você também pode ouvir eventos de consulta usando este:

DB::listen(function($sql, $bindings, $time)
{
    var_dump($sql);
});

Consulte as informações dos documentos aqui em Listening For Query Events


6

O uso do log de consulta não fornece a consulta RAW real em execução, especialmente se houver valores associados. Esta é a melhor abordagem para obter o sql bruto:

DB::table('tablename')->toSql();

ou mais envolvidos:

$query = Article::whereIn('author_id', [1,2,3])->orderBy('published', 'desc')->toSql();
dd($query);

5

Se você estiver usando o Laravel 5, precisará inseri-lo antes da consulta ou no middleware:

\DB::enableQueryLog();


3

no Laravel 4, você pode realmente usar um Event Listener para consultas ao banco de dados.

Event::listen('illuminate.query', function($sql, $bindings)
{
    foreach ($bindings as $val) {
        $sql = preg_replace('/\?/', "'{$val}'", $sql, 1);
    }

    Log::info($sql);
});

Coloque esse trecho em qualquer lugar, por exemplo, dentro start/global.php. Ele gravará as consultas no log de informações ( storage/log/laravel.log).


3
Event::listen('illuminate.query', function($sql, $param)
{
    \Log::info($sql . ", with[" . join(',', $param) ."]<br>\n");
});

coloque-o em global.php, ele registrará sua consulta sql.


2

O perfilador Loic Sharma SQL suporta o Laravel 4, eu o instalei. As instruções estão listadas aqui . Os passos são os seguintes:

  1. Adicione "loic-sharma/profiler": "1.1.*"na seção requerer em composer.json
  2. Execute a atualização automática => php composer.phar self-updateno console.
  3. Execute a atualização do compositor => php composer.phar update loic-sharma/profilerno console também `
  4. Adicione 'Profiler\ProfilerServiceProvider',a matriz do provedor em app.php
  5. Adicione também 'Profiler' => 'Profiler\Facades\Profiler',a matriz de aliasses em app.php
  6. Executar php artisan config:publish loic-sharma/profilerno console

2

Última consulta impressa

$queries = \DB::getQueryLog();
$last_query = end($queries);

// Add binding to query
foreach ($last_query['bindings'] as $val) {
        $last_query['query'] = preg_replace('/\?/', "'{$val}'", $last_query['query'], 1);
}
dd($last_query);


0

Laravel 3

Outra maneira de fazer isso é:

#config/database.php

'profiler' => true

Para todos os resultados das consultas:

print_r(DB::profiler());

Para o último resultado:

print_r(DB::last_query());

0

Para obter a última consulta executada no laravel, usaremos a DB::getQueryLog()função laravel, que retornará todas as consultas executadas. Para obter a última consulta, usaremos a end()função que retorna a última consulta executada.

$student = DB::table('student')->get();
$query = DB::getQueryLog();
$lastQuery = end($query);
print_r($lastQuery);

Tomei referência em http://www.tutsway.com/how-to-get-the-last-executed-query-in-laravel.php .


Sua resposta não parece contribuir com nenhum conhecimento novo para o que a resposta aceita por Raphael_ já cobre.
Jaak Kütt

0

Existe uma maneira muito fácil de fazer isso: a partir da sua consulta laravel basta renomear qualquer nome de coluna, isso mostrará um erro na sua consulta .. :)


Maneira hacky rápida. Não é útil na produção, mas no modo de desenvolvimento é bom em alguns casos.
vez disso
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.