2017-12-18 3 views
0

Die grundlegende Eigenschaft eines ORM sagt normalerweise, da die DB-Migration von einer Datenbank zu einer anderen leicht möglich ist. Hier habe ich anfangs die MySQL-Datenbank für mein Projekt verwendet und plane, diese nach PostgreSQL zu migrieren. Bei der Migration funktioniert es fast alle einfachen Abfragen mit Select * aus der Tabelle, Einfügen von Updates etc.Laravel elequent ORM funktioniert nicht, wenn von mysql nach postgresql migriert wird

Aber wenn ich durch die einige datediff Funktion in MySQL komme, das ORM schafft keine entsprechenden Abfragen in PostgreSQL.

Hier ist meine Abfrage

$result = DB::table('sales_target') 
       ->select(db::raw('DATEDIFF(end_date,start_date) as DaysInQuarter')) 
       ->whereraw("sales_target.target_quarter=$currentQuarter AND sales_target.target_year=$currentYear and status=1") 
       ->first(); 

Ich frage mich, ob ich die Abfrage in vollständig ORM Struktur geschrieben haben, oder nicht. Bitte helfen Sie mir dabei.

Edit 1

n kurz ich will mir jemand sagen, wie ich diese Abfrage

DB::table('sales_target') 
       ->select(db::raw("DATEDIFF(end_date,start_date) AS DaysInQuarter")) 
       ->first(); 

schreiben kann, die in beiden mysql und postgresl mit ORM funktionieren sollen.

In Mysql funktioniert es richtig, aber in Postgresql ist es nicht.

Ich erhalte eine Fehlermeldung wie diese

No function matches the given name and argument types. You might need to add explicit type casts. (SQL: select DATEDIFF(end_date,start_date) AS DaysInQuarter from "sales_target" limit 1) 

Antwort

0

kann ich die Abfrage durch das Schreiben wie dieses

DB::table('sales_target') 
       ->select(db::raw(" DATE_PART('day', end_date - start_date) AS DaysInQuarter")) 
       ->whereRaw("sales_target.target_quarter=? AND sales_target.target_year= ? and status=1", [$currentQuarter, $currentYear]) 
       ->first(); 

ich in beredten denken verwalten müssen wir manuell die Funktion DATEDIFF zu date_part ändern. Aber in ORM wie Hibernate denke ich, dass sie selbst diese Funktion in verschiedenen SQL-Abfrage ändern.

0

Wenn Sie „db :: raw (“ dann ist dies nicht mehr ORM.

Sie nur genau diese Zeichenfolge direkt an den Datenbankserver senden, wie es ist.

Überprüfen Sie, ob Postgresql die gleiche Syntax für die Funktion DateDiff

0

zu allererst Sie ORM nicht hier verwenden Sie Query Builder verwenden und nicht Eloquent

die zweite Sache ist, dass Laravel wird den Job nicht für Sie tun -.., wenn Sie Wenn Sie rohe Ausdrücke verwenden, sollten Sie sie gemäß db verwenden Motor, den du benutzt.

Darüber hinaus sollten Sie über SQL-Injektionen kümmern, jetzt ist es möglich, einen Code in Ihre Abfrage zu injizieren, sollten Sie verwenden:

$result = DB::table('sales_target') 
       ->select(db::raw('DATEDIFF(end_date,start_date) as DaysInQuarter')) 
       ->whereRaw("sales_target.target_quarter=? AND sales_target.target_year= ? and status=1", [$currentQuarter, $currentYear]) 
       ->first(); 

Natürlich in obigem Fall wahrscheinlich $currentQuarter und $currentYear Variablen sind Sie die volle Kontrolle Es ist jedoch besser, vorbereitete Anweisungen zu verwenden, falls Sie sich später dafür entscheiden, Benutzereingabedaten zu verwenden.

+0

Ist nicht Abfrage-Generator auch auf eloquent basiert? Sind ihre Funktionen nicht austauschbar (ich kann jede DB-Funktion in einer eloquenten Frage verwenden)? Ich stimme zu, dass Db :: Raw in keiner Weise ORM Bitte beachten Sie, dass ich gerade im Lernmodus bin, wenn ich das frage :) – Radu

+0

Nein, Eloquent verwendet Abfrage-Generator, aber Abfrage-Generator verwendet nicht Eloquent. In oben verwenden Sie Query Builder, weil Sie mit 'DB :: table ('sales_target') beginnen' - wenn Sie mit Ihrem Modell 'SalesTarget' begonnen haben, dann würden Sie Eloquent verwenden –

+0

Danke, mein Herr! – Radu

Verwandte Themen