2016-07-12 5 views
0

Also versuche ich eine Abfrage zu meiner SQL-Datenbank von meinem Backend (das ist in PHP mit Laravel geschrieben). Ich habe eine Tabelle in meiner Datenbank mit einer Spalte mit dem Titel "created_at", die Werte vom Typ "timestamp" enthält. Ich möchte, wenn ich eine Abfrage an meine Datenbank sende, nur die Zeilen (oder Instanzen, die ich vermute) meiner Tabelle auswählen, die 30 Tage oder weniger vom aktuellen Datum entfernt sind. Ich habe versucht, mit dem Schlüsselwort "where" zu experimentieren, aber ich konnte nicht so funktionieren, wie ich es wollte.Filter SQL-Datenbank-Abfrage von Zeitstempel, Backend in PHP mit Laravel

Wenn ich die Tabelle in meiner Datenbank durchsuche, werden die Daten im Format "JJJJ-MM-TT hh: mm: ss" geschrieben, aber ich bin nicht sicher, wie man sie vergleicht, wenn sie in diesem Format sind, und ich weiß nicht, wie man sie konvertiert, während man eine Abfrage durchführt. Ich habe mir die Methode whereBetween() in Laravel angeschaut, aber ich habe das nicht zum Laufen gebracht, weil ich nicht wusste, wie ich sie vergleichen würde.

Im Moment meine Abfrage sieht wie folgt aus:

$topUser = DB::table('statistics') 
      ->join('users', 'statistics.user_id', '=', 'users.id', 'inner') 
      ->select('fname', 'user_id', DB::raw('sum(price) as total_collection')) 
      ->groupBy('user_id') 
      ->orderBy('total_collection','desc') 
      ->get(); 

Was ich tun möchte, in Pseudo-Code, ist etwas entlang der Linien von;

->where 'created_at' <= 30 days ago 

Vielen Dank im Voraus!

+0

WHERE ("created_at" mit "<=", DB :: raw ("NOW() - INTERVAL 30 DAY")) '? – apokryfos

Antwort

1

Es ist im Grunde so einfach.

->whereDate('created_at', '<=', \Carbon\Carbon::now()->subDays(30)); 
+0

Haben Sie Carbon nicht benutzt, das ist ein Plugin, das heruntergeladen werden muss und was nicht, oder? Vielen Dank für die Antwort! –

+1

@NyfikenGul Carbon wird standardmäßig mit Laravel geliefert. Laravel verwendet es intern für viele Datenlogiken. – ceejayoz

+0

Ah, ich verstehe! Das ist großartig, ich werde dann darauf schauen –

1

Sie können durch die Nutzung von MySQL Datumsfunktionen nehmen DB::raw

->where('created_at', '<=', DB::raw("DATE_SUB(CURDATE(),INTERVAL 30 DAY)") 
+0

Am besten vermeiden Sie 'DB :: roh 'wenn möglich. Es neigt dazu, Ihren Code auf einer einzigen Datenbank-Engine zu sperren. – ceejayoz

+0

Wird versuchen! Danke, mein Junge! –

+0

@ceejayoz Sie könnten 'DB :: raw' verwenden und gleichzeitig SQL-konform sein (diese Abfrage ist nicht gültig). – apokryfos