php - tables - run raw query laravel




Obtenha a consulta executada no Laravel 3/4 (14)

L4 one-liner

(que escreve a consulta):

$q=\DB::getQueryLog();dd(end($q));

Como posso recuperar a consulta SQL executada no Laravel 3/4 usando o Laravel Query Builder ou o 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 em laravel.log?


Laravel 3

Outra maneira de fazer isso é:

#config/database.php

'profiler' => true

Para todos os resultados da consulta:

print_r(DB::profiler());

Para o último resultado:

print_r(DB::last_query());

Laravel 5

Note 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á algo como isto (o arquivo de log padrão é laravel.log ):

[2015-09-25 12:33:29] testing.DEBUG: Consulta 0: {"query": "selecione * de 'users' onde ('user_id' =?)", "Bindings": ["9"] , "tempo": 0,23}

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


Aqui está um rápido snippet de Javascript que você pode usar no seu modelo de página mestra. Contanto que seja incluído, todas as consultas serão enviadas para o Console Javascript do seu navegador. Ele os imprime em uma lista facilmente legível, simplificando a navegação pelo seu site e ver quais consultas estão sendo executadas em cada página.

Quando acabar 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 recomendaria usar o Clockwork extensão 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 em PHP, ampliando Developer Tools com um novo painel fornecendo todos os tipos de informações úteis para depuração e criação de perfil de seus scripts PHP, incluindo informações sobre solicitação, cabeçalhos, dados GET e POST, cookies, dados de sessão, consultas de banco de dados rotas, visualização do tempo de execução do aplicativo e muito mais. O Clockwork inclui suporte pronto para os aplicativos baseados no Laravel 4 e no Slim 2, você pode adicionar suporte a qualquer outro framework personalizado por meio de uma API extensível.


Há uma maneira muito fácil de fazê-lo, a partir de sua consulta laravel basta renomear qualquer nome de coluna, ele irá mostrar-lhe um erro com sua consulta .. :)



Para Eloquent você pode apenas fazer:

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

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


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

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

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


Se você está usando o Laravel 5, você precisa inserir isto antes da consulta ou no middleware:

\DB::enableQueryLog();

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

'profiler' => true,

Em seu application/config/application.php e application/config/database.php

Isso habilita 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.


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

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

Veja as informações dos documentos here em Listening For Query Events


Última consulta print

$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);

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

Colocá-lo em global.php ele irá registrar sua consulta SQL.





laravel-query-builder