Pode até ser melhor enviá-lo para o log do seu aplicativo usando a Logclasse: Log::debug(DB::getQueryLog())
enviá-
35
Pode ser necessário ativar isso, pois está desativado por padrão agora. Você pode usar este comando para ativá-lo temporariamente:DB::enableQueryLog();
Joshua Fricke
5
Eu tentei sua resposta. O que eu tentei é DB::enableQueryLog(); dd(DB::getQueryLog());Mas ele retorna apenas []....
Eu sou a pessoa mais estúpida
6
Se você tiver vários bancos de dados, talvez seja necessário fazê-lo #DB::connection('database')->getQueryLog()
Damien Ó Ceallaigh
745
Use o toSql()método em uma QueryBuilderinstância.
DB::table('users')->toSql() retornaria:
selecione * em `usuários`
Isso é mais fácil do que conectar um ouvinte de evento e também permite verificar como a consulta realmente se parecerá a qualquer momento enquanto você a estiver construindo.
Penso que esta é a maneira mais fácil ao usar Eloquent fora Laravel
Gab
8
@Tormsson Isso não é possível porque o PHP nunca tem a consulta com as ligações substituídas por seus valores. Para obter as consultas na íntegra, você precisa registrá-las no MySQL. Há mais informações aqui: stackoverflow.com/questions/1786322/…
Matthew
40
@Stormsson você pode usar o getBindingsmétodo Isso retornará as ligações para que elas sejam vinculadas à instrução SQL.
Danronmoon
2
Muito útil para depurar consultas complicadas que o Eloquent se recusa a executar, pois elas não aparecem no log de consultas.
21816 BobChao87
34
Para obter consulta com bindinds$query = \DB::table('users')->where('id', 10); $sql = str_replace_array('?', $query->getBindings(), $query->toSql()); dd($sql);
Ennio Sousa
88
DB::QueryLog()só funciona depois de executar a consulta $builder->get(). Se você deseja obter a consulta antes de executá-la, pode usar o $builder->toSql()método Este é o exemplo de como obter o sql e vinculá-lo:
Essa é, de longe, a melhor resposta, simples e direta ao ponto. Obrigado :)
Sobakus
18
Como um one-liner:$query = vsprintf(str_replace(array('?'), array('\'%s\''), $builder->toSql()), $builder->getBindings());
kramer65
Isto deve ser incluído no quadro como uma função nativa .. obrigado
Tomáš Mleziva
Observe que isso não funcionará se sua consulta já tiver sinais de porcentagem, como para uma LIKEconsulta ou ao formatar datas. Você precisará escapar dos primeiros com sinais de porcentagem duplos.
The Unknown Dev
Existem preocupações de segurança ao fazer isso? As ligações vêm higienizadas $builder->getBindings()?
solidau
56
Você pode ouvir o evento 'illuminate.query'. Antes da consulta, adicione o seguinte ouvinte de evento:
Eu recebo chamada para o método indefinido Illuminate \ Database \ Query \ Builder :: listen () no Laravel 4
Miguel Stevens
2
Graças isso é ótimo. É bom notar que dd é uma função que produz um despejo de uma dada variável e execução final do script e também que a importação de eventos, incluemuse Illuminate\Support\Facades\Event;
radtek
1
@radtek: Em vez de use Illuminate\Support\Facades\Event;você pode simplesmente fazer use Event;uma vez que é uma fachada .
TachyonVortex
50
Se você está tentando obter o log usando o Illuminate sem o Laravel, use:
as versões atualizadas parecem ter o log de consultas desativado por padrão (o exemplo acima retorna uma matriz vazia). Para ativar novamente, ao inicializar o Capsule Manager, pegue uma instância da conexão e chame o enableQueryLogmétodo
$capsule::connection()->enableQueryLog();
EDITAR NOVAMENTE
Levando em consideração a pergunta real, você pode realmente fazer o seguinte para converter a consulta única atual em vez de todas as consultas anteriores:
estou recebendo esse tipo de retorno da consulta "name = [{" name ":" rifat "}]" o que preciso fazer para obter apenas "name = rifat"?
incorpóreo
Gostaria de imprimir suas ligações, parece que você está passando uma matriz em vez de uma cadeia de caracteres
Luke Snowden
Este é um começo útil, mas parece deixar de adicionar aspas simples em torno de valores parametrizados, como quando eu passo uma string como 'US/Eastern'.
Ryan
1
@ Ryan isso é verdade, portanto, porque eu afirmei quick function. Eu acredito que o código subjacente usará os métodos prepare ( php.net/manual/en/mysqli.prepare.php ), e é por isso que apenas isso ?é necessário. Você pode php.net/manual/en/function.is-numeric.php para determinar se deve ou não encapsular a entrada entre aspas simples.
Luke Snowden
1
@LukeSnowden Sua resposta é genial! Finalmente tirei um tempo para experimentar sua nova versão (que editei acima para incluir sua is_numericideia) e ela funciona! Eu amo isto. Obrigado.
21717 Ryan
36
Existe um método eloquente para obter a string de consulta.
toSql ()
no nosso caso,
DB::table('users')->toSql();
Retorna
select*from users
é a solução exata que retorna a string de consulta SQL ... Espero que seja útil ...
Resposta melhorada para incluir todas as observações feitas nos comentários. Muito obrigado.
Yevgeniy Afanasyev
13
Primeiro, você precisará ativar o log de consulta chamando:
DB::enableQueryLog();
após consultas usando a fachada do banco de dados, você pode escrever:
dd(DB::getQueryLog());
a saída será como abaixo:
array:1[▼0=> array:3[▼"query"=>"select * from `users` left join `website_user` on `users`.`id` = `website_user`.`user_id` left join `region_user` on `users`.`id` = `region_user`.`user_id` left ▶""bindings"=> array:5[▶]"time"=>3.79]]
oi eu usei $ result = DB :: select ('select * from sqrt_user_modules onde user_id =: id', ['id' => $ user]); DB :: enableQueryLog (); mas não obteve nenhuma saída dd (DB :: getQueryLog ());
Anoop PS
precisamos incluir qualquer biblioteca
Anoop PS
1
Etapa 1: DB :: enableQueryLog (); etapa 2: $ result = DB :: select ('select * from sqrt_user_modules em que user_id =: id', ['id' => $ user]); etapa 3: dd (DB :: getQueryLog ());
Ravi Mane
12
Esta é a melhor solução que posso sugerir a qualquer um para depurar a última consulta eloquente ou a consulta final, embora isso tenha sido discutido também:
Nota: do Laravel 5.1 a 5.3, Como o Eloquent Builder não faz uso da Macroablecaracterística, não é possível adicionar toRawSqlum alias ao Eloquent Builder em tempo real. Siga o exemplo abaixo para obter o mesmo.
Por exemplo, Eloquent Builder ( Laravel 5.1 - 5.3 )
A coisa de escutar é útil, declare-a antes de executar a consulta e despeje o sql & bindings dentro do método Imperfeito, mas funciona mais rápido / mais fácil do que outras respostas.
Andrew
7
A maneira mais fácil é cometer um erro deliberado . Por exemplo, quero ver a consulta SQL completa da seguinte relação:
(4/4) ErrorException SQLSTATE [42S22]: Coluna não encontrado: 1054 não informada coluna 'eqtype_jobs.created_ats' em 'lista de campo' (SQL: select
jobs. *, eqtype_jobs. set_id, Como pivot_set_id,
eqtype_jobs.job_id Como pivot_job_id, eqtype_jobs. created_ats
Como pivot_created_ats, eqtype_jobs. updated_atComo
pivot_updated_at, eqtype_jobs. idComo pivot_idde jobsjunção interna eqtype_jobsem jobs. id= eqtype_jobs. job_idonde
eqtype_jobs. set_id= 56 ordem pelo pivot_created_atlimite de desc 20 deslocamento 0) (Exibir: /home/said/www/factory/resources/views/set/show.blade.php)
A mensagem de erro acima retorna a consulta SQL completa com o erro
SQL:select jobs.*, eqtype_jobs.set_id as pivot_set_id, eqtype_jobs.job_id as pivot_job_id, eqtype_jobs.created_ats as pivot_created_ats, eqtype_jobs.updated_at as pivot_updated_at, eqtype_jobs.id as pivot_id from jobs inner join eqtype_jobs on jobs.id = eqtype_jobs.job_id where eqtype_jobs.set_id =56 order by pivot_created_at desc limit 20 offset 0
Agora, basta remover o extra sde created_at e testar esse SQL como desejar em qualquer editor de SQL, como o editor de phpMyAdmin SQL!
Esta é a melhor resposta de longe! Tão simples! :)
Picard
Isso não mostrará a consulta com ligações, ou seja, ligações serão mostradas como:id
Shantha Kumara
@ShanthaKumara De fato, não sei qual é a versão ou a configuração do Laravel que você usou. No entanto, todos os trechos ou códigos na minha resposta foram copiados e colados na saída de código real do projeto Laravel 5.4.
precisa saber é o seguinte
6
Para ver a consulta executada pelo Laravel, use o log de consultas laravel
Obrigado. dd funciona muito bem. DB :: tabela ('dados') -> onde ('a', 1) -> dd ();
Waqas
Melhor do que as outras respostas listadas.
Hamees A. Khan 30/12/19
5
Essa é a função que eu coloquei na minha classe de modelo base. Simplesmente passe o objeto do construtor de consultas para ele e a string SQL será retornada.
Se você deseja receber cada consulta SQL executada pelo seu aplicativo, você pode usar o método listen. Este método é útil para registrar consultas ou depuração. Você pode registrar seu ouvinte de consulta em um provedor de serviços:
<?php
namespaceApp\Providers;useIlluminate\Support\Facades\DB;useIlluminate\Support\ServiceProvider;classAppServiceProviderextendsServiceProvider{/**
* Bootstrap any application services.
*
* @return void
*/publicfunction boot(){
DB::listen(function($query){// $query->sql// $query->bindings// $query->time});}/**
* Register the service provider.
*
* @return void
*/publicfunctionregister(){//}}
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 depurar e criar um perfil de seus aplicativos PHP, incluindo informações sobre solicitação, cabeçalhos, obter e publicar dados, cookies, dados de sessão, consultas de banco de dados, rotas, visualização do tempo de execução do aplicativo e muito mais.
Eu criei algumas funções simples para obter o SQL e as ligações de algumas consultas.
/**
* getSql
*
* Usage:
* getSql( DB::table("users") )
*
* Get the current SQL and bindings
*
* @param mixed $query Relation / Eloquent Builder / Query Builder
* @return array Array with sql and bindings or else false
*/function getSql($query){if( $query instanceofIlluminate\Database\Eloquent\Relations\Relation ){
$query = $query->getBaseQuery();}if( $query instanceofIlluminate\Database\Eloquent\Builder ){
$query = $query->getQuery();}if( $query instanceofIlluminate\Database\Query\Builder ){return['query'=> $query->toSql(),'bindings'=> $query->getBindings()];}returnfalse;}/**
* logQuery
*
* Get the SQL from a query in a closure
*
* Usage:
* logQueries(function() {
* return User::first()->applications;
* });
*
* @param closure $callback function to call some queries in
* @return Illuminate\Support\Collection Collection of queries
*/function logQueries(closure $callback){// check if query logging is enabled
$logging = DB::logging();// Get number of queries
$numberOfQueries = count(DB::getQueryLog());// if logging not enabled, temporarily enable itif(!$logging ) DB::enableQueryLog();
$query = $callback();
$lastQuery = getSql($query);// Get querylog
$queries =newIlluminate\Support\Collection( DB::getQueryLog());// calculate the number of queries done in callback
$queryCount = $queries->count()- $numberOfQueries;// Get last queries
$lastQueries = $queries->take(-$queryCount);// disable query loggingif(!$logging ) DB::disableQueryLog();// if callback returns a builder object, return the sql and bindings of itif( $lastQuery ){
$lastQueries->push($lastQuery);}return $lastQueries;}
Uso:
getSql( DB::table('users'));// returns // [// "sql" => "select * from `users`",// "bindings" => [],// ]
getSql( $project->rooms());// returns// [// "sql" => "select * from `rooms` where `rooms`.`project_id` = ? and `rooms`.`project_id` is not null",// "bindings" => [ 7 ],// ]
Por mais que eu ame essa estrutura, odeio quando ela age como lixo.
DB::enableQueryLog()é totalmente inútil. DB::listené igualmente inútil. Ele mostrou parte da consulta quando eu disse $query->count(), mas se eu fizer$query->get() , não tem nada a dizer.
A única solução que parece funcionar consistentemente é colocar intencionalmente alguma sintaxe ou outro erro nos parâmetros ORM, como um nome de coluna / tabela inexistente, executar seu código na linha de comando enquanto estiver no modo de depuração, e isso expelirá o erro SQL com a consulta completa, finalmente. Caso contrário, espero que o erro apareça no arquivo de log, se executado a partir do servidor web.
$users = DB::table('users')->select(DB::raw('count(*) as user_count, username '))->where('uid','>=',10)->limit(100)->groupBy('username')->get();
dd($users);
Veja o log storage/logs/laravel-2019-10-27.log:
[2019-10-2717:39:17]local.DEBUG:[SQL EXEC]{"raw sql":"select count(*) as user_count, username from `users` where `uid` >= '10' group by `username` limit 100","time":304.21}
echo User::where('status', 1)->toSql();
Respostas:
Para exibir na tela as últimas consultas executadas, você pode usar isto:
Acredito que as consultas mais recentes estarão na parte inferior da matriz.
Você terá algo assim:
(Obrigado ao comentário de Josué abaixo.)
fonte
Log
classe:Log::debug(DB::getQueryLog())
DB::enableQueryLog();
DB::enableQueryLog(); dd(DB::getQueryLog());
Mas ele retorna apenas[]
....DB::connection('database')->getQueryLog()
Use o
toSql()
método em umaQueryBuilder
instância.DB::table('users')->toSql()
retornaria:Isso é mais fácil do que conectar um ouvinte de evento e também permite verificar como a consulta realmente se parecerá a qualquer momento enquanto você a estiver construindo.
fonte
getBindings
método Isso retornará as ligações para que elas sejam vinculadas à instrução SQL.$query = \DB::table('users')->where('id', 10); $sql = str_replace_array('?', $query->getBindings(), $query->toSql()); dd($sql);
DB::QueryLog()
só funciona depois de executar a consulta$builder->get()
. Se você deseja obter a consulta antes de executá-la, pode usar o$builder->toSql()
método Este é o exemplo de como obter o sql e vinculá-lo:OU apenas cometa um erro de consulta como chamar tabela ou coluna inexistente, você verá a consulta gerada na exceção XD
fonte
$query = vsprintf(str_replace(array('?'), array('\'%s\''), $builder->toSql()), $builder->getBindings());
LIKE
consulta ou ao formatar datas. Você precisará escapar dos primeiros com sinais de porcentagem duplos.$builder->getBindings()
?Você pode ouvir o evento 'illuminate.query'. Antes da consulta, adicione o seguinte ouvinte de evento:
Isso imprimirá algo como:
fonte
use Illuminate\Support\Facades\Event;
use Illuminate\Support\Facades\Event;
você pode simplesmente fazeruse Event;
uma vez que é uma fachada .Se você está tentando obter o log usando o Illuminate sem o Laravel, use:
Você também pode criar uma função rápida como:
EDITAR
as versões atualizadas parecem ter o log de consultas desativado por padrão (o exemplo acima retorna uma matriz vazia). Para ativar novamente, ao inicializar o Capsule Manager, pegue uma instância da conexão e chame o
enableQueryLog
métodoEDITAR NOVAMENTE
Levando em consideração a pergunta real, você pode realmente fazer o seguinte para converter a consulta única atual em vez de todas as consultas anteriores:
fonte
'US/Eastern'
.quick function
. Eu acredito que o código subjacente usará os métodos prepare ( php.net/manual/en/mysqli.prepare.php ), e é por isso que apenas isso?
é necessário. Você pode php.net/manual/en/function.is-numeric.php para determinar se deve ou não encapsular a entrada entre aspas simples.is_numeric
ideia) e ela funciona! Eu amo isto. Obrigado.Existe um método eloquente para obter a string de consulta.
toSql ()
no nosso caso,
Retorna
é a solução exata que retorna a string de consulta SQL ... Espero que seja útil ...
fonte
->where('foo', '=', 'bar')
bar costuma aparecer no sqlfonte
->toSql()
como faria se houver mais argumentos após o modelo. por exemploUser::where('id', 1)->toSql()
Se você usa o laravel 5.1 e o MySQL, pode usar esta função feita por mim:
Como parâmetro de entrada, você pode usar um destes
fonte
Primeiro, você precisará ativar o log de consulta chamando:
após consultas usando a fachada do banco de dados, você pode escrever:
a saída será como abaixo:
fonte
Esta é a melhor solução que posso sugerir a qualquer um para depurar a última consulta eloquente ou a consulta final, embora isso tenha sido discutido também:
fonte
Primeira maneira:
Simplesmente você pode fazer as seguintes coisas usando o
toSql()
métodoSe não estiver funcionando, você pode configurar a coisa na documentação do laravel .
Segunda maneira:
Outra maneira de fazer isso é
DB::getQueryLog()
mas se ele retornar uma matriz vazia, por padrão está desativado, visite este ,
apenas ative com
DB::enableQueryLog()
e ele vai funcionar :)para mais informações, visite o Github Issue para saber mais.
Espero que ajude :)
fonte
Uma substituição 'macroable' para obter a consulta SQL com as ligações.
Adicione a função macro abaixo no método
AppServiceProvider
boot()
Adicione um alias para o Eloquent Builder. ( Laravel 5.4+ )
Em seguida, depure como de costume. ( Laravel 5.4+ )
Por exemplo, Query Builder
Por exemplo, Eloquent Builder
Por exemplo, Eloquent Builder ( Laravel 5.1 - 5.3 )
fonte
use pacote debugbar
fonte
De laravel
5.2
e em diante. você pode usarDB::listen
para obter consultas executadas.Ou se você deseja depurar uma única
Builder
instância, pode usar otoSql
métodofonte
A maneira mais fácil é cometer um erro deliberado . Por exemplo, quero ver a consulta SQL completa da seguinte relação:
Eu apenas para fazer uma coluna não ser encontrada, aqui eu escolho
created_at
e mudei paracreated_ats
adicionandos
à direita o seguinte :Portanto, o depurador retornará o seguinte erro:
A mensagem de erro acima retorna a consulta SQL completa com o erro
Agora, basta remover o extra
s
de created_at e testar esse SQL como desejar em qualquer editor de SQL, como o editor de phpMyAdmin SQL!fonte
:id
Para ver a consulta executada pelo Laravel, use o log de consultas laravel
fonte
A partir de Laravel 5.8.15 o construtor de consulta tem agora
dd
edump
métodos para que você pode fazerfonte
Essa é a função que eu coloquei na minha classe de modelo base. Simplesmente passe o objeto do construtor de consultas para ele e a string SQL será retornada.
fonte
Na minha opinião, esta será a melhor abordagem para iniciantes:
Isso também é descrito aqui. https://stackoverflow.com/a/59207557/9573341
fonte
Para o laravel 5.5.X
Se você deseja receber cada consulta SQL executada pelo seu aplicativo, você pode usar o método listen. Este método é útil para registrar consultas ou depuração. Você pode registrar seu ouvinte de consulta em um provedor de serviços:
Fonte
fonte
Adicione esta função ao seu aplicativo e simplesmente chame.
Saída : "selecione * de
user
ondelang
= ordem 'en' estatus
= '1' peloupdated_at
limite de desc 25 deslocamento 0"fonte
Você pode usar este pacote para obter todas as consultas que estão sendo executadas quando você carrega sua página
fonte
Imprimir última consulta
fonte
Se você não estiver usando o Laravel, mas usando o pacote Eloquent, então:
fonte
você pode usar um relógio
mas funciona também no firefox
fonte
Eu criei algumas funções simples para obter o SQL e as ligações de algumas consultas.
Uso:
fonte
Por mais que eu ame essa estrutura, odeio quando ela age como lixo.
DB::enableQueryLog()
é totalmente inútil.DB::listen
é igualmente inútil. Ele mostrou parte da consulta quando eu disse$query->count()
, mas se eu fizer$query->get()
, não tem nada a dizer.A única solução que parece funcionar consistentemente é colocar intencionalmente alguma sintaxe ou outro erro nos parâmetros ORM, como um nome de coluna / tabela inexistente, executar seu código na linha de comando enquanto estiver no modo de depuração, e isso expelirá o erro SQL com a consulta completa, finalmente. Caso contrário, espero que o erro apareça no arquivo de log, se executado a partir do servidor web.
fonte
Se você estiver usando o funileiro e quiser registrar a consulta SQL formada, poderá fazer
fonte
Tente o seguinte:
Nota: get () foi substituído por toSql () para exibir a consulta SQL bruta.
fonte
Minha maneira de fazer isso, com base na exibição de log, só precisa modificar o arquivo
app/Providers/AppServiceProvider.php
:app/Providers/AppServiceProvider.php
storage/logs/laravel-2019-10-27.log
:fonte