Wie bekomme ich mysql
Abfrage von a laravel
Anfrage
Konvertieren:
App\User::where('balance','>',0)->where(...)->get();
Zu:
SELECT * FROM users WHERE `balance`>0 and ...
Said Vaziry
Wie bekomme ich mysql
Abfrage von a laravel
Anfrage
Konvertieren:
App\User::where('balance','>',0)->where(...)->get();
Zu:
SELECT * FROM users WHERE `balance`>0 and ...
RAUSHAN KUMAR
verwenden toSql()
Methode von Laravel, um die Abfrage wie auszuführen
App\User::where('balance','>',0)->where(...)->toSql();
Laravel zeigt Ihnen jedoch keine Parameter in Ihrer Abfrage an, da diese nach der Vorbereitung der Abfrage gebunden werden. Verwenden Sie dies, um die Bindungsparameter abzurufen
$query=App\User::where('balance','>',0)->where(...);
print_r($query->getBindings() );
Aktivieren Sie das Abfrageprotokoll als DB::enableQueryLog()
und dann die zuletzt ausgeführten Abfragen auf dem Bildschirm ausgeben, können Sie dies verwenden,
dd(DB::getQueryLog());
Diese Methode ersetzt Parameter durch ?
markieren. select * from `users` where `balance` > ?
– Saeed Vaziry
12. Juni 2017 um 11:15 Uhr
@ 543310 ja, denn das gibt eine Rohabfrage für dynamische Daten ?
so können Sie Ihren eigenen Wert anstelle von angeben ?
und direkt ausführen
– RAUSHAN KUMAR
12. Juni 2017 um 11:21 Uhr
Gibt es eine Möglichkeit, eine Abfrage mit Parametern zu erhalten?
– Saeed Vaziry
12. Juni 2017 um 11:24 Uhr
Wenn nicht, wie kann ich dieser Rohabfrage Parameter hinzufügen?
– Saeed Vaziry
12. Juni 2017 um 11:27 Uhr
Sie können so verwenden $query=App\User::where('balance','>',0)->where(...)->toSql(); print_r( $query->getBindings() );
um die Bindungsparameter zu erhalten
– RAUSHAN KUMAR
12. Juni 2017 um 11:28 Uhr
Sie können diese Funktion zu Ihren Helfern hinzufügen
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;
}
und so verwenden:
getRealQuery(App\User::where('balance','>',0)->where(...),true)
Herzlich willkommen .. , ich habe dies erstellt, weil es sehr nützlich ist
– Honarkha
10. Oktober 2017 um 8:16 Uhr
Beachten Sie, dass ?
kann Teil einer Zeichenfolge sein.
– Paul Spiegel
10. Oktober 2017 um 19:10 Uhr
@paul-spiegel alle ersetzen ? mit Bindungswerten
– Honarkha
11. Oktober 2017 um 5:22 Uhr
@RAUSHANKUMAR Du hast Bounty gestartet, aber nicht benutzt, warum?
– Honarkha
11. Oktober 2017 um 6:09 Uhr
@honarkhah Sie müssen zwischen Platzhaltern und unterscheiden ?
in einem String wie hier: ->selectRaw("'How are you?' AS message")
. Für eine zuverlässige Lösung benötigen Sie (eine Art) einen SQL-Parser.
– Paul Spiegel
15. Oktober 2017 um 17:39 Uhr
Um eine einzelne Abfrage zu drucken, verwenden Sie die Methode toSql() von Laravel, damit die Abfrage wie folgt ausgeführt wird
App\User::where('balance','>',0)->where(...)->toSql();
Laravel kann optional alle Abfragen, die für die aktuelle Anfrage ausgeführt wurden, im Speicher protokollieren. In einigen Fällen, z. B. beim Einfügen einer großen Anzahl von Zeilen, kann dies jedoch dazu führen, dass die Anwendung übermäßig viel Speicher verwendet, daher sollten Sie dies vermeiden.
Um das Protokoll zu aktivieren, können Sie die verwenden enableQueryLog Methode als
DB::connection()->enableQueryLog();
Um ein Array der ausgeführten Abfragen zu erhalten, können Sie die verwenden getQueryLog Methode als
$queries = DB::getQueryLog();
Weitere Informationen erhalten Sie hier Laravel-Abfrageprotokoll aktivieren
Ein weiterer Ansatz, um alle in Laravel verwendeten Abfragen anzuzeigen, ohne das Abfrageprotokoll zu installieren, ist die Installation LaravelDebugBar von hier Laravel-Debug-Leiste. Es ist ein Paket, mit dem Sie Ihre Anwendung während der Entwicklung schnell und einfach im Auge behalten können.
Mayank Pandeyz
Versuchen Sie Folgendes, um die rohe SQL-Abfrage zu drucken:
DB::enableQueryLog();
// Your query here
$queries = DB::getQueryLog();
print_r($queries);
Hier ist eine Hilfsfunktion, die Ihnen das zuletzt ausgeführte SQL mitteilt.
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
}
Hier ist die bindDataToQuery-Funktion, die das ‘?’ Leerzeichen mit echten Parametern.
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;
}
ja, das gleiche was ich oben erwähnt habe
– RAUSHAN KUMAR
13. Oktober 2017 um 5:50 Uhr
Viktor L
Es ist so seltsam, dass das Laravel keine Möglichkeit hat, das rohe SQL einfach zu bekommen, es ist jetzt immerhin Version 6 …
Hier ist eine Problemumgehung, die ich selbst verwendet habe, um schnell das rohe SQL mit Parametern zu erhalten, ohne eine Erweiterung zu installieren …
Machen Sie Ihr ursprüngliches SQL einfach absichtlich falsch
Wie Veränderung
DB::table('user')
Zu
DB::table('user1')
wobei die Tabelle “user1” gar nicht existiert!
Führen Sie es dann erneut aus.
Sicher wird es eine Ausnahme geben, die von Laravel gemeldet wird.
SQLSTATE[42S02]: Base table or view not found: 1146 Table 'user1' doesn't exist (SQL: ...)
Und jetzt können Sie sehen, dass die rohe SQL mit Parametern direkt nach der Zeichenfolge „(SQL:“
Ändern Sie den falschen Tabellennamen wieder in den richtigen und los geht’s!
ja, das gleiche was ich oben erwähnt habe
– RAUSHAN KUMAR
13. Oktober 2017 um 5:50 Uhr
Roshan Perera
In Laravel 5.4 (ich habe dies in anderen Versionen nicht überprüft) fügen Sie diese Funktion in die “App”=>”Providers”=>”AppServiceProvider.php” ein.
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");
}
);
}
}
Danach installieren,
https://github.com/ARCANEDEV/LogViewer
und dann können Sie alle ausgeführten SQL-Abfragen sehen, ohne den Code zu bearbeiten.
meine Antwort Parameter ersetzen ? mit verbindlichen Werten
– Honarkha
11. Oktober 2017 um 6:11 Uhr
@honarkhah danke für die Antwort … mein Problem wurde mit der Antwort von RAUSHAN KUMAR gelöst
– Saeed Vaziry
12. Oktober 2017 um 13:09 Uhr
Was ist Ihr Zweck für die Abfrage?
– Hirendrasinh S. Rathod
16. Oktober 2017 um 10:32 Uhr
@HirendrasinhS.Rathod Ich habe dies verwendet, um meine Abfrage auf meinem node.js-Server auszuführen
– Saeed Vaziry
16. Oktober 2017 um 10:45 Uhr
Um es auf dem node.js-Server auszuführen, verwenden Sie die hier erwähnte Lösung laravel-tricks.com/tricks/display-all-sql-executed-in-eloquent Andernfalls habe ich eine verrückte Idee, um die Abfrage auf der Webseite anzuzeigen, aber das hilft Ihnen möglicherweise nicht.
– Hirendrasinh S. Rathod
16. Oktober 2017 um 11:01 Uhr