Genere la consulta MySQL sin procesar desde Laravel Query Builder

6 minutos de lectura

Avatar de usuario de Saeed Vaziry
saeed vaziry

Como puedo conseguir mysql consulta de un laravel consulta

Convertir:

App\User::where('balance','>',0)->where(...)->get();

A:

SELECT * FROM users WHERE `balance`>0 and ...

  • ¿Mi respuesta reemplaza los parámetros? con valores vinculantes

    – Honarkhah

    11 de octubre de 2017 a las 6:11

  • @honarkhah gracias por responder… mi problema se resolvió con la respuesta de RAUSHAN KUMAR

    – Saeed Vaziry

    12 de octubre de 2017 a las 13:09


  • ¿Cuál es su propósito para obtener la consulta?

    – Hirendrasinh S. Rathod

    16 oct 2017 a las 10:32

  • @ HirendrasinhS.Rathod Usé esto para ejecutar mi consulta en mi servidor node.js

    – Saeed Vaziry

    16 oct 2017 a las 10:45

  • para ejecutarlo en el servidor node.js use la solución mencionar aquí laravel-tricks.com/tricks/display-all-sql-ejecutado-en-elocuente de lo contrario, tengo una idea loca para ver la consulta en la página web, pero eso puede no ayudarlo.

    – Hirendrasinh S. Rathod

    16 oct 2017 a las 11:01

Avatar de usuario de RAUSHAN KUMAR
RAUSHAN KUMAR

usar toSql() método de laravel para que la consulta se ejecute como

App\User::where('balance','>',0)->where(...)->toSql();

Pero Laravel no le mostrará parámetros en su consulta, porque están vinculados después de la preparación de la consulta. Para obtener los parámetros de vinculación, utilice este

$query=App\User::where('balance','>',0)->where(...);
print_r($query->getBindings() );

habilitar el registro de consultas como DB::enableQueryLog() y luego mostrar en la pantalla las últimas consultas ejecutadas, puede usar esto,

dd(DB::getQueryLog());

  • este método reemplaza los parámetros con ? marca. select * from `users` where `balance` > ?

    – Saeed Vaziry

    12 de junio de 2017 a las 11:15


  • @ 543310 sí, porque eso da una consulta sin procesar, para datos dinámicos pone ? para que pueda dar su propio valor en lugar de ? y ejecutar directamente

    – RAUSHAN KUMAR

    12 de junio de 2017 a las 11:21

  • ¿Hay alguna manera de obtener una consulta con parámetros?

    – Saeed Vaziry

    12 de junio de 2017 a las 11:24

  • si no, ¿cómo puedo agregar parámetros a esta consulta sin procesar?

    – Saeed Vaziry

    12 de junio de 2017 a las 11:27

  • Puedes usar así $query=App\User::where('balance','>',0)->where(...)->toSql(); print_r( $query->getBindings() ); para obtener los parámetros de vinculación

    – RAUSHAN KUMAR

    12 de junio de 2017 a las 11:28

puedes agregar esta función a tus ayudantes

function getRealQuery($query, $dumpIt = false)
{
    $params = array_map(function ($item) {
        return "'{$item}'";
    }, $query->getBindings());
    $result = str_replace_array('\?', $params, $query->toSql());
    if ($dumpIt) {
        dd($result);
    }
    return $result;
}

y usar así:

getRealQuery(App\User::where('balance','>',0)->where(...),true)

  • De nada .. , creé esto porque es muy útil

    – Honarkhah

    10 de octubre de 2017 a las 8:16


  • Tenga en cuenta que ? podría ser parte de una cadena.

    –Paul Spiegel

    10/10/2017 a las 19:10

  • @ paul-spiegel ¿reemplazar todo? con valores vinculantes

    – Honarkhah

    11 de octubre de 2017 a las 5:22


  • @RAUSHANKUMAR comenzaste con recompensas pero no las usaste, ¿por qué?

    – Honarkhah

    11 de octubre de 2017 a las 6:09

  • @honarkhah Debe distinguir entre marcadores de posición y ? en una cadena como aquí: ->selectRaw("'How are you?' AS message"). Para una solución confiable, necesitará (más o menos) un analizador SQL.

    –Paul Spiegel

    15/10/2017 a las 17:39

Método 1

Para imprimir una sola consulta, use el método toSql() de laravel para que la consulta se ejecute como

App\User::where('balance','>',0)->where(...)->toSql();

Método 2

Laravel puede registrar opcionalmente en la memoria todas las consultas que se han ejecutado para la solicitud actual. Pero en algunos casos, como cuando se inserta una gran cantidad de filas, esto puede hacer que la aplicación use un exceso de memoria, por lo que debe evitarlo.

Para habilitar el registro, puede usar el enableQueryLog método como

DB::connection()->enableQueryLog();

Para obtener una matriz de las consultas ejecutadas, puede utilizar el getQueryLog método como

$queries = DB::getQueryLog();

Puedes obtener mas detalles aqui Laravel Habilitar registro de consultas

Método 3

Otro enfoque para mostrar todas las consultas utilizadas en Laravel sin habilitar el registro de consultas instalar el LaravelDebugBar de aquí Barra de depuración de Laravel. Es un paquete que le permite controlar rápida y fácilmente su aplicación durante el desarrollo.

Avatar de usuario de Mayank Pandeyz
mayank pandeyz

Para imprimir la consulta sql sin procesar, intente:

DB::enableQueryLog();
// Your query here
$queries = DB::getQueryLog();
print_r($queries);

Referencia

Aquí hay una función de ayuda que le dice el último SQL ejecutado.

use DB;
public static function getLastSQL()
{
    $queries = DB::getQueryLog();
    $last_query = end($queries);
          // last_query is the SQL with with data binding like 
          //   { 
          //       select ? from sometable where field = ? and field2 = ? ;
          //       param1,
          //       param2,
          //       param3,
          //   }
          //   which is hard to read.
    $last_query = bindDataToQuery($last_query);     
          // here, last_query is the last SQL you have executed as normal SQL
          //     select param1 from sometable where field=param2 and field2 = param3;
    return $last_query
}

Aquí está la función bindDataToQuery, ¿quién llena el ‘?’ espacios en blanco con parámetros reales.

protected static function bindDataToQuery($queryItem){
    $query = $queryItem['query'];
    $bindings = $queryItem['bindings'];
    $arr = explode('?',$query);
    $res="";
    foreach($arr as $idx => $ele){
        if($idx < count($arr) - 1){
            $res = $res.$ele."'".$bindings[$idx]."'";
        }
    }
    $res = $res.$arr[count($arr) -1];
    return $res;
}

  • si, lo mismo que mencione arriba

    – RAUSHAN KUMAR

    13 de octubre de 2017 a las 5:50

Avatar de usuario de Victor L
Víctor L.

Es tan extraño que laravel no admita ninguna forma de obtener el sql sin procesar fácilmente, ahora es la versión 6 después de todo …

Aquí hay una solución que utilicé para obtener rápidamente el sql sin formato con parámetros sin instalar ninguna extensión…

Simplemente haga que su sql original sea INCORRECTO deliberadamente

como el cambio

DB::table('user')

a

DB::table('user1')

¡donde la tabla “usuario1” no existe en absoluto!

Luego ejecútalo de nuevo.

Seguro que habrá una excepción reportada por laravel.

SQLSTATE[42S02]: Base table or view not found: 1146 Table 'user1' doesn't exist (SQL: ...)

Y ahora puede ver que el sql sin procesar con parámetros está justo después de la cadena “(SQL:”

Vuelva a cambiar del nombre de tabla incorrecto al correcto y listo.

  • si, lo mismo que mencione arriba

    – RAUSHAN KUMAR

    13 de octubre de 2017 a las 5:50

Avatar de usuario de Roshan Perera
Roshan Perera

En Laravel 5.4 (no verifiqué esto en otras versiones), agregue esta función en “App”=>”Providers”=>”AppServiceProvider.php” .

public function boot()
{

    if (App::isLocal()) {

        DB::listen(
            function ($sql) {
                // $sql is an object with the properties:
                //  sql: The query
                //  bindings: the sql query variables
                //  time: The execution time for the query
                //  connectionName: The name of the connection

                // To save the executed queries to file:
                // Process the sql and the bindings:
                foreach ($sql->bindings as $i => $binding) {
                    if ($binding instanceof \DateTime) {
                        $sql->bindings[$i] = $binding->format('\'Y-m-d H:i:s\'');
                    } else {
                        if (is_string($binding)) {
                            $sql->bindings[$i] = "'$binding'";
                        }
                    }
                }

                // Insert bindings into query
                $query = str_replace(array('%', '?'), array('%%', '%s'), $sql->sql);

                $query = vsprintf($query, $sql->bindings);

                // Save the query to file
                /*$logFile = fopen(
                    storage_path('logs' . DIRECTORY_SEPARATOR . date('Y-m-d') . '_query.log'),
                    'a+'
                );*/
                Log::notice("[USER] $query");
            }
        );
    }
}

Después de esa instalación,
https://github.com/ARCANEDEV/LogViewer
y luego puede ver todas las consultas SQL ejecutadas sin editar el código.

¿Ha sido útil esta solución?