Eine Situation, in die ich einigermaßen oft gerate, ist eine, in der meine Modelle entweder beginnen:
- Wachsen Sie mit unzähligen Methoden zu Monstern heran
ODER
- Ermöglichen es Ihnen, ihnen SQL-Teile zu übergeben, sodass sie flexibel genug sind, um nicht eine Million verschiedener Methoden zu erfordern
Angenommen, wir haben ein "Widget" -Modell. Wir beginnen mit einigen grundlegenden Methoden:
- get ($ id)
- Einfügen ($ record)
- update ($ id, $ record)
- löschen ($ id)
- getList () // Liste der Widgets abrufen
Das ist alles in Ordnung und gut, aber dann brauchen wir eine Berichterstattung:
- listCreatedBetween ($ start_date, $ end_date)
- listPurchasedBetween ($ start_date, $ end_date)
- listOfPending ()
Und dann wird die Berichterstattung immer komplexer:
- listPendingCreatedBetween ($ start_date, $ end_date)
- listForCustomer ($ customer_id)
- listPendingCreatedBetweenForCustomer ($ customer_id, $ start_date, $ end_date)
Sie können sehen, wo dies zunimmt ... irgendwann haben wir so viele spezifische Abfrageanforderungen, dass ich entweder Tonnen und Tonnen von Methoden implementieren muss, oder eine Art "Abfrage" -Objekt, das ich an eine einzelne -> Abfrage (Abfrage) übergeben kann $ query) Methode ...
... oder beißen Sie einfach in die Kugel und machen Sie so etwas:
- list = MyModel-> query ("start_date> X AND end_date <Y AND pending = 1 AND customer_id = Z")
Es hat einen gewissen Reiz, nur eine Methode wie diese zu haben, anstatt 50 Millionen andere spezifischere Methoden ... aber es fühlt sich manchmal "falsch" an, einen Stapel dessen, was im Grunde SQL ist, in den Controller zu stopfen.
Gibt es einen "richtigen" Weg, mit solchen Situationen umzugehen? Scheint es akzeptabel, solche Abfragen in eine generische -> query () -Methode zu packen?
Gibt es bessere Strategien?