Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从Laravel查询生成器生成原始MySQL查询_Php_Mysql_Laravel - Fatal编程技术网

Php 从Laravel查询生成器生成原始MySQL查询

Php 从Laravel查询生成器生成原始MySQL查询,php,mysql,laravel,Php,Mysql,Laravel,如何获得laravel查询的mysql查询 转换: App\User::where('balance','>',0)->where(...)->get(); SELECT * FROM users WHERE `balance`>0 and ... 至: App\User::where('balance','>',0)->where(...)->get(); SELECT * FROM users WHERE `balance`>0 and

如何获得
laravel
查询的
mysql
查询

转换:

App\User::where('balance','>',0)->where(...)->get();
SELECT * FROM users WHERE `balance`>0 and ...
至:

App\User::where('balance','>',0)->where(...)->get();
SELECT * FROM users WHERE `balance`>0 and ...
使用laravel的
toSql()
方法获得要执行的查询,如

App\User::where('balance','>',0)->where(...)->toSql();
DB::connection()->enableQueryLog();
但Laravel不会在查询中显示参数,因为它们是在准备查询后绑定的。要获取绑定参数,请使用以下命令

$query=App\User::where('balance','>',0)->where(...);
print_r($query->getBindings() );
将查询日志启用为
DB::enableQueryLog()
,然后将上次运行的查询输出到屏幕,您可以使用此

dd(DB::getQueryLog());

要打印原始sql查询,请尝试:

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

要在laravel中获取mysql查询,您需要将查询记录为

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

检查引用:

当我想查看生成的SQL时,我不会用打印语句或“
dd
s”干扰应用程序:

DB::listen(function ($query) { 
    Log::info($query->sql, $query->bindings);
});

// (DB and Log are the facades in Illuminate\Support\Facades namespace)
这将把sql输出到Laravel日志(位于
storage/logs/Laravel.log
)。下面是一个有用的命令,用于对该文件进行后续写入

tail -n0 -f storage/logs/laravel.log

您可以将此功能添加到助手中

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;
}

然后像这样使用:

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

下面是一个非常简单快捷的方法
将列的名称写错,就像不管“balance”如何写“balancedd”,当您执行包含所有参数的代码时,查询将显示在错误屏幕上,并且未找到该列的错误

在Laravel甚至PHP中实际上都没有这样的东西,因为PHP在内部将带有查询字符串的参数发送到数据库,在那里它(可能)被解析为原始查询字符串


公认的答案实际上是乐观的解决方案,有点“可选工作”。

显示Laravel中使用的所有查询而无需任何代码更改的简单方法是安装LaraveldBugbar()


作为功能的一部分,您将获得一个选项卡,该选项卡将显示页面使用的所有查询。

这里有一个帮助函数,它告诉您最后执行的SQL

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
}
下面是bindDataToQuery函数,它用实数参数填充“?”空格

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;
}
受保护的静态函数bindDataToQuery($queryItem){
$query=$queryItem['query'];
$bindings=$queryItem['bindings'];
$arr=分解(“?”,$query);
$res='';
foreach($arr as$idx=>$ele){
如果($idx<计数($arr)-1){
$res=$res.$ele.“'.”$bindings[$idx]。“'”;
}
}
$res=$res.$arr[计数($arr)-1];
返回$res;
}
在Laravel 5.4中(我没有在其他版本中检查此功能),将此功能添加到 “App”=>“Providers”=>“AppServiceProvider.php”

安装之后, 然后,您可以看到每个执行的SQL查询,而无需编辑代码

DB::enableQueryLog(); (查询) $d=DB::getQueryLog();打印“”;印刷研究(d美元);打印“”

您将得到刚刚运行的mysql查询。

Method1 要打印单个查询,请使用laravel的toSql()方法来获得要执行的查询,如

App\User::where('balance','>',0)->where(...)->toSql();
DB::connection()->enableQueryLog();
方法2 Laravel可以选择在内存中记录为当前请求运行的所有查询。但在某些情况下,例如插入大量行时,这可能会导致应用程序使用过多内存,因此应避免这种情况

要启用日志,可以使用以下方法启用enableQueryLog

$queries = DB::getQueryLog();
$results = App\User::where('balance','>',0)->where(...)->toSql();
dd($results);
要获取已执行查询的数组,可以使用以下方法

$queries = DB::getQueryLog();
$results = App\User::where('balance','>',0)->where(...)->toSql();
dd($results);
你可以在这里得到更多的细节

方法3 显示Laravel中使用的所有查询而不启用查询日志的另一种方法是从此处安装LaravelDebugBar。 它是一个软件包,允许您在开发过程中快速、轻松地跟踪应用程序。

尝试以下方法:

DB::table('user')

注意:get()已替换为toSql()以显示原始SQL查询。

奇怪的是,laravel不支持任何轻松获取原始SQL的方法,毕竟它现在是版本6

这里有一个我自己使用的解决方法,可以在不安装任何扩展的情况下快速获取带有参数的原始sql

只是故意使您的原始sql错误

喜欢变化

DB::table('user1')

表“user1”根本不存在

然后再运行一次

当然,laravel会报告一个异常

现在您可以看到带有参数的原始sql就在字符串“(sql:



将错误的表名改回正确的表名,就可以了!

此方法将参数替换为
标记。
从`users`中选择*where`balance`>?
@543310是,因为这会提供原始查询,它会将动态数据放入
,因此您可以用自己的值代替
,并直接执行cuteis有没有一种方法可以获取带参数的查询?如果没有,我如何才能将参数添加到此原始查询?您可以像这样使用
$query=App\User::where('balance','>',0)->where(…)->toSql();print\r($query->getBindings())
为了获取bind参数表示欢迎..,我创建了它,因为它非常有用。请注意,
可能是字符串的一部分。@paul spiegel将所有?替换为绑定values@RAUSHANKUMAR您启动了bounty,但没有使用它们,为什么?@honarkhah您需要在如下字符串中区分占位符和
:ode>->选择RAW(“你好吗?”作为消息”)。要获得可靠的解决方案,您需要(某种程度上)SQL解析器。我的答案是用绑定替换参数values@honarkhah感谢您的回答…我的问题通过RAUSHAN KUMAR的回答解决了您获取查询的目的是什么?@HirendrasinhS.Rathod我用它在我的node.js服务器上执行查询在node.js服务器上执行它使用这里提到的解决方案,否则我有一个疯狂的想法查看网页上的查询,但这可能对你没有帮助。是的,和我上面提到的一样是的,和我上面提到的一样是的,和我上面提到的一样