Laravel $q->wo() zwischen den Terminen
Ich bin versucht, meine cron nur get Projects
aufgrund von Rezidiven/erneuern in den nächsten 7 Tagen zu versenden Erinnerungs-E-Mails. Ich habe gerade herausgefunden meine Logik funktioniert nicht ganz.
Momentan habe ich die Abfrage:
$projects = Project::where(function($q){
$q->where('recur_at', '>', date("Y-m-d H:i:s", time() - 604800));
$q->where('status', '<', 5);
$q->where('recur_cancelled', '=', 0);
});
Jedoch merkte ich, was ich tun müssen, ist so etwas wie:
Psudo SQL:
SELECT * FROM projects WHERE recur_at > recur_at - '7 days' AND /* Other status + recurr_cancelled stuff) */
Wie würde ich das in Laravel 4, und mit den DATETIME-Datentyp ist, habe ich nur getan, diese Art der Sache mithilfe von Zeitstempeln.
Update:
Geschafft, dies zu lösen, nach der Verwendung den folgenden code, Stackoverflow hilft auch, wenn Sie können, ziehen Sie bits von code und schauen Sie aus dem Zusammenhang gerissen.
$projects = Project::where(function($q){
$q->where(DB::raw('recur_at BETWEEN DATE_SUB(NOW(), INTERVAL 7 DAY) AND NOW()'));
$q->where('status', '<', 5);
$q->where('recur_cancelled', '=', 0);
});
Aktualisiert Frage: gibt es eine bessere Möglichkeit, dies zu tun in Laravel/Eloquent?
Update 2:
Die erste Auflösung, die am Ende nicht Recht, nach weiteren Tests, habe ich jetzt behoben und getestet mit der folgenden Lösung:
$projects = Project::where(function($q){
$q->where('recur_at', '<=', Carbon::now()->addWeek());
$q->where('recur_at', '!=', "0000-00-00 00:00:00");
$q->where('status', '<', 5);
$q->where('recur_cancelled', '=', 0);
});
DB::raw
also Nein, es gibt keinen anderen Weg, dies zu tun mit Eloquent auf seine eigenen. Auf der anderen Seite, wie Sie kommen, wenn Sie eine DATETIME anstelle von TIMESTAMP-Spalte? Was ich verlange ist unabhängig zu der ursprünglichen Frage, aber TIMESTAMP passt besser in vielen Fällen im Vergleich zu DATETIME.DATETIME scheint die "standard" - Zeit-Feld, das Laravel verwendet, so hielt ich mit ihm.
Statt wo(DB::raw(sql)), die Sie verwenden können, whereRaw(sql)
Ich denke, ich mag die Art von der
where(DB::raw())
- format, wie es scheint ein wenig klarer. Gibt es irgendeinen technischen Grund, warum whereRaw()
ist besser?Nein, es ist nicht die standard-Uhrzeit-Feld. Standard-Uhrzeit-Feld ist, und immer sein wird, ein
TIMESTAMP
. Der Grund dafür ist, dass der ZEITSTEMPEL immer in UTC, wo mit DATETIME und man sollte wissen, welche Zeitzone Sie kam, so dass Sie durchführen können, Zeit-Konvertierung für einen Benutzer in einer anderen Zeit zone. Auch Eloquent verwendet die timestamp-Typ und nicht datetime. Beide Arten zeigen Sie die exakt gleichen Datum formatiert, so würde ich dringend raten, Sie zu verwenden, timestamp anstelle von datetime.
InformationsquelleAutor Jono20201 | 2014-07-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie die Kette Ihrer
where
s direkt, ohnefunction(q)
. Es gibt auch ein nettes date handling-Paket in laravel, genannt Carbon. So könnte man etwas machen wie:Nur sicherstellen, dass Sie benötigen, Carbon, Komponist und Sie sind mit Carbon-namespace (use Carbon\Carbon;) und es sollte funktionieren.
BEARBEITEN:
Als Joel sagte, die man tun könnte:
Schön! Auf jeden Fall geht es in die Zukunft. Ein kurzer Blick in die api und Dank dir habe ich herausgefunden, dass es auch orBetween und so weiter...
Ich schaffte es, den gewünschten Effekt mit
$q->where('recur_at', '<=', Carbon::now()->addWeek());
. Ich benutze lieber diefunction($q)
wie ich denke, es macht den code leichter für mich zu Lesen.Oh, jetzt sehe ich, dass ich gab das Datum in der Vergangenheit, und Sie wollte schon einen der kommenden Woche, vität, aber Du hast den Punkt 🙂 ich habe bearbeitet die Antwort
Toll, tickte Ihre Antwort. Ich verbrachte ein paar Minuten versucht zu verstehen, die Mathematik mit meinem Geschäftspartner und den Einsatz von Carbon machte es einfacher.
InformationsquelleAutor Tom
Nicht wan, um Durcheinander mit carbon. Also hier ist meine Lösung
DateTime
mitCarbon
in Ihrer Lösung, das Ergebnis ist genau das gleiche.InformationsquelleAutor Edmund Sulzanok
@Tom : Anstelle der Verwendung von 'jetzt' oder 'addWeek', wenn wir das Datum in folgender Form enthalten, die es nicht geben richtigen Datensätze
gibt es Datensätze mit Datum form 2015-10-16 auf weniger als 2015-10-23.
Wenn der Wert recur_at ist 2015-10-23 00:00:00 dann nur es zeigt, dass Rekord
sonst, wenn es 2015-10-23 12:00:45 dann es wird nicht angezeigt.
InformationsquelleAutor Jaykumar Patil
Bearbeitet: bitte beachten Sie, dass
whereBetween('date',$start_date,$end_date)
inklusive dem ersten date.
$startDate->startOfDay();
und$endDate->endOfDay()
ansonsten ist es standardmäßig, was Zeit ist es jetzt.InformationsquelleAutor Edwin M