2016-12-21 3 views
0

Ich habe eine ziemlich komplexe Abfrage mit vielen Daten, die abgerufen werden. Momentan habe ich zwei Jobs mit ähnlichen komplexen Anfragen und jetzt muss ich einen dritten Job schreiben. Die Abfragen werden auch für Databases verwendet, daher muss ich sicherstellen, dass sie dieselben sind, die nicht optimal sind. Ich habe redundanten Code. Ich möchte jedoch meinen Code verbessern und einfach einen Job verwenden, der jede Anfrage akzeptiert.Eloquente Abfrage an einen Job senden

Was ich tun möchte, ist die Abfrage für meine Databases zu einem einzigen Job übergeben, der jede Abfrage und führt es einen Excel-Export erstellen. Ich bin jedoch nicht sicher, ob es möglich ist, die tatsächliche Abfrage anstelle des Ergebnisses zu serialisieren, da die Abfrage sehr lange dauern kann und ich sie über die Redis-Warteschlange, die ich habe, ausführen möchte.

Wenn ich versuche, die Eloquent Abfrage an einen Job, den ich bekommen passieren „Man kann nicht serialisiert werden oder unserialize PDO Instanzen“

Wie kann ich dieses Problem loszuwerden und die Abfrage an den Job senden ausgeführt werden?

Antwort

0

Laravel Jobs verwenden standardmäßig das SerializesModels Merkmal, also überprüfen Sie, ob Ihr Job dieses Merkmal verwendet. Außerdem können Sie PDO-Objekte nicht serialisieren, weshalb Sie die Ausnahme erhalten.

Um den Fehler loszuwerden, können Sie das Merkmal herausnehmen, aber IMHO würde ich Ihre Eloquent Abfrage nicht an einen Job übergeben. Stattdessen sollten die Abfragen in der Jobausführung basierend auf einem Minimum der erforderlichen Parameter an den Job übergeben werden.

„Was würde ich tun möchte, ist die Abfrage für meine Datentabellen zu einem einzigen Job, der jede Abfrage dauert verwendet geben und führt es einen Excel-Export zu schaffen“ kann

Eine Abfrage oder eine Reihe von Abfragen am wahrscheinlichsten als eine Aufgabe in Worten beschrieben, so erstellen Sie einen separaten Job für jeden speziellen Zweck. Wenn Sie für alle Ihre Aufgaben einen einzelnen Job erstellen, wäre dieser weniger leserlich, schwieriger zu pflegen. & Schließen Sie eine Unterscheidung zwischen dem Zweck des Jobs ab.

Stattdessen würde ich den "redundanten" Code entfernen, von dem Sie sprechen, erstellen Sie einen Job, in dem Sie den gemeinsamen Code schreiben & erweitern Sie diesen Job in separate Jobs. In Bezug auf wiederverwendbaren Code, könnten Sie ein Repository oder einen Service verwenden & rufen Sie es aus Ihren separaten Jobs.

Verwandte Themen