Laravel 4: Wie führe ich ein Raw-SQL aus?


78

Ich möchte eine Tabelle in Laravel 4 umbenennen, weiß aber nicht, wie ich das machen soll.

Das SQL ist alter table photos rename to images. Wenn es eine eloquente Lösung gibt, würde ich auch gerne wissen, wie man ein unformatiertes SQL ausführt, da es manchmal einfach keine Alternative gibt.

Antworten:


146

Im Laravel 4-Handbuch geht es darum, rohe Befehle wie folgt auszuführen:

DB::select(DB::raw('RENAME TABLE photos TO images'));

edit: Ich habe das gerade in der Laravel 4-Dokumentation gefunden, was wahrscheinlich besser ist:

DB::statement('drop table users');

Update: In Laravel 4.1 (möglicherweise 4.0 - ich bin mir nicht sicher) können Sie dies auch für eine rohe Where-Abfrage tun:

$users = User::whereRaw('age > ? and votes = 100', array(25))->get();

Weiteres Update Wenn Sie speziell eine Tabellenumbenennung durchführen möchten - dafür gibt es einen Schemabefehl -, lesen Sie dazu die Antwort von Mike weiter unten.


4
Es gibt eine tatsächliche Schema :: Rename-Funktion ($ from, $ to), die von Mike Branski unten erwähnt wird. Verwenden Sie das und es wird unabhängig von der Datenbank funktionieren.
trm42

Warum ist dies die akzeptierte Antwort, wenn nicht die richtige L4-Methode verwendet wird Schema::rename($from, $to), wie von mir, @ trm42 und @Mike Branski erwähnt? Bitte erwägen Sie, es zu ändern, um anderen Zuschauern eine aktuelle Antwort zu geben.
Sean the Bean

1
Weil der Titel lautet "Wie starte ich ein Raw-SQL?" Die Frage enthält jedoch ein Beispiel zum Umbenennen der Tabelle. Die Frage sagt auch I'd also like to know how to run a raw SQL- also ist meine Antwort für diesen Teil. Sie haben Recht, dass die Schema::rename()Funktion für den speziellen Fall der Umbenennung von Tabellen nützlich ist.
Laurence

Das ist wahr, aber meine Frage richtete sich an das OP, @duality_. (Übrigens, der Grund, warum ich fragen würde, ob dies die akzeptierte Antwort sein sollte, ist, dass es den Zuschauern nicht die jetzt üblichen Methoden zum Ausführen von Rohabfragen bietet , wie unter laravel.com/docs/4.2/database#running-queries dokumentiert Tatsächlich ist Ihre Aussage "Es gibt auch einige Befehle zum Ausführen von Schemaänderungen - aber das Umbenennen einer Tabelle gehört nicht dazu." Seit ~ Februar 2013 nicht mehr zutreffend. Wenn Sie möchten, dass dies die akzeptierte Antwort bleibt, schlage ich Ihnen vor Aktualisieren Sie es, um für zukünftige Zuschauer nützlicher zu sein.)
Sean the Bean


15

Sie können auch DB::unpreparedfür ALTER TABLEAbfragen verwenden.

DB::unpreparedist für Abfragen wie gedacht CREATE TRIGGER. Im Wesentlichen werden jedoch SQL-Rohabfragen direkt ausgeführt. (ohne Verwendung von PDO- preparedAnweisungen)

https://github.com/laravel/framework/pull/54


Es funktioniert für mich, wenn ich verwenden möchte DB::query("SET foreign_key_checks=0");
Swdev

1
@swdev: PDO unterstützt SET Abfragen . Mit DB::query( PDO::query) wird jedoch unnötigerweise eine vorbereitete Anweisung erstellt, da die obige Abfrage keine Variable enthält.
Smitrp

10

Der beste Weg, dies zu tun, habe ich bisher gefunden, um Schritt Laravel zu umgehen und die Abfrage direkt mit dem Pdo-Objekt auszuführen.

Beispiel

DB::connection()->getPdo()->exec( $sql );

Normalerweise finde ich es für eine einmalige Abfrage schneller und effizienter, einfach mein Datenbankabfragetool zu öffnen und die Abfrage mit vollständiger Syntaxprüfung einzugeben und dann direkt auszuführen.

Dies ist wichtig, wenn Sie mit gespeicherten Prozeduren arbeiten oder Datenbankfunktionen verwenden müssen

Beispiel 2 Setzen Sie "created_at" auf den Wert, den Sie benötigen, und lassen Sie die Kohlenstoff-Funkiness auf der Seite sinken

$sql = 'UPDATE my_table SET updated_at = FROM_UNIXTIME(nonce) WHERE id = ' . strval($this->id);
DB::statement($sql);

Ich fand, dass dies in einem Controller funktionierte, aber nicht in einer Migration


Genial, endlich eine Lösung, die funktioniert. Ich musste das benutzen, weil ich es tat DB::connection()->getPdo()->exec('USE '.$dbConfig['database']);. Ich habe die Datenbank in einem Laravel-Befehl gelöscht und neu erstellt und musste dies tun.
Aditya MP

1
Vielen Dank für Ihre Antwort. Wir finden den einfachsten Weg, um Raw
Create

1
Abhängig davon, wo sich die $ this-> id befindet, ist sie möglicherweise anfällig für SQL-Injection.
Nordpol

Die Möglichkeit, mehrere SQL-Befehle in einer Zeichenfolge auszuführen, ist äußerst gefährlich, wenn Sie Benutzereingaben in eine der Abfragen einfügen. Dies sollte in der Antwort vermerkt werden. ( Informationen dazu finden Sie unter php.net/manual/en/function.pg-escape-string.php oder php.net/manual/en/mysqli.real-escape-string.php .) Außerdem wird nur geantwortet Die Hälfte der OP-Frage (wie eine unformatierte SQL-Abfrage ausgeführt wird, nicht wie eine Tabelle in Laravel 4 umbenannt wird) oder die Angabe, dass es eine offizielle Lösung gibt (siehe laravel.com/docs/4.2/schema#creating-and-dropping- Tabellen ). Downvoting.
Sean the Bean

8

Die akzeptierte Methode zum Umbenennen einer Tabelle in Laravel 4 ist die Verwendung des Schema-Generators. Sie möchten also Folgendes tun:

Schema::rename('photos', 'images');

Von http://laravel.com/docs/4.2/schema#creating-and-dropping-tables

Wenn Sie wirklich selbst eine unformatierte SQL-Abfrage schreiben möchten, können Sie immer Folgendes tun:

DB::statement('alter table photos rename to images');

Hinweis: Laravel der DB - Klasse unterstützt auch rohe SQL läuft select, insert, update, und deleteAbfragen, wie zB:

$users = DB::select('select id, name from users');

Weitere Informationen finden Sie unter http://laravel.com/docs/4.2/database#running-queries .


2

Dies ist mein vereinfachtes Beispiel, wie man RAW SELECT ausführt, Ergebnisse abruft und auf die Werte zugreift.

$res = DB::select('
        select count(id) as c
        from prices p 
        where p.type in (2,3)
    ');
    if ($res[0]->c > 10)
    {
        throw new Exception('WOW');
    }

Wenn Sie nur ein SQL-Skript ohne Rückgabe ausführen möchten, verwenden Sie dies

DB::statement('ALTER TABLE products MODIFY COLUMN physical tinyint(1) AFTER points;');

Getestet in Laravel 5.1


1

Laravel raw sql - Abfrage einfügen :

Erstellen Sie einen Get-Link zum Einfügen von Daten, auf die über die URL zugegriffen werden kann. Unser Linkname lautet also 'insertintodb' und innerhalb dieser Funktion verwenden wir die db-Klasse. Die Datenbankklasse hilft uns bei der Interaktion mit der Datenbank. wir us db Klasse statische Funktion einfügen. Innerhalb der Einfügefunktion schreiben wir unsere PDO-Abfrage, um Daten in die Datenbank einzufügen. In der folgenden Abfrage werden 'mein Titel' und 'mein Inhalt' als Daten in die Beitragstabelle eingefügt.

Fügen Sie den folgenden Code in Ihre web.php-Datei im Routenverzeichnis ein:

Route::get('/insertintodb',function(){
DB::insert('insert into posts(title,content) values (?,?)',['my title','my content']);
});

Feuern Sie jetzt über der Abfrage des Browser-Links unten ab:

localhost/yourprojectname/insertintodb

Sie können die Ausgabe der obigen Einfügeabfrage sehen, indem Sie in Ihre Datenbanktabelle gehen. Sie finden einen Datensatz mit der ID 1.

Laravel raw sql - Abfrage lesen:

Erstellen Sie jetzt einen Get-Link zum Lesen von Daten, auf den über die URL zugegriffen werden kann. Unser Linkname lautet also 'readfromdb'. wir uns db Klasse statische Funktion lesen. Innerhalb der Lesefunktion schreiben wir unsere PDO-Abfrage, um Daten aus der Datenbank zu lesen. In der folgenden Abfrage werden die Daten der ID '1' aus der Beitragstabelle gelesen.

Fügen Sie den folgenden Code in Ihre web.php-Datei im Routenverzeichnis ein:

Route::get('/readfromdb',function() {
    $result =  DB::select('select * from posts where id = ?', [1]);
    var_dump($result);
});

Jetzt oben Feuer lesen Abfrage vom Browser-Link unten:

localhost/yourprojectname/readfromdb

Guten Tag, was ist der zweite Parameter in DB :: select (... ich kann ihn nicht in der Dokumentation finden. Bitte helfen Sie.
Jewgenij Afanasjew
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.