ดังนั้นสถานการณ์ที่ฉันพบเจอบ่อยพอสมควรคือสถานการณ์ที่แบบจำลองของฉันเริ่มต้นด้วย:
- เติบโตเป็นสัตว์ประหลาดด้วยวิธีตันและตัน
หรือ
- อนุญาตให้คุณส่งชิ้นส่วนของ SQL ไปยังพวกเขาเพื่อให้พวกเขามีความยืดหยุ่นเพียงพอที่จะไม่ต้องใช้วิธีการที่แตกต่างกันนับล้าน
ตัวอย่างเช่นสมมติว่าเรามีโมเดล "วิดเจ็ต" เราเริ่มต้นด้วยวิธีการพื้นฐานบางอย่าง:
- ได้รับ ($ ID)
- แทรก ($ บันทึก)
- อัปเดต ($ id, $ บันทึก)
- ลบ ($ ID)
- getList () // รับรายการวิดเจ็ต
ทั้งหมดนี้เป็นเรื่องที่ดีและสวยงาม แต่จากนั้นเราต้องการรายงาน
- รายการสร้างระหว่าง ($ start_date, $ end_date)
- รายการซื้อระหว่าง ($ start_date, $ end_date)
- listOfPending ()
จากนั้นการรายงานเริ่มซับซ้อนขึ้น:
- listPendingCreatedBetween ($ start_date, $ end_date)
- listForCustomer ($ CUSTOMER_ID)
- listPendingCreatedBetweenForCustomer ($ customer_id, $ start_date, $ end_date)
คุณสามารถดูได้ว่าสิ่งนี้กำลังเติบโตที่ใด ... ในที่สุดเราก็มีข้อกำหนดการสืบค้นเฉพาะมากมายที่ฉันต้องใช้วิธีการตันและตันหรือวัตถุ "แบบสอบถาม" บางประเภทที่ฉันสามารถส่งไปยังแบบสอบถามเดียว -> แบบสอบถาม (แบบสอบถาม $ แบบสอบถาม) วิธีการ ...
... หรือเพียงแค่กัดกระสุนและเริ่มทำอะไรเช่นนี้:
- list = MyModel-> query ("start_date> X AND end_date <Y AND ที่รอดำเนินการ = 1 AND customer_id = Z")
มีบางอย่างที่น่าสนใจเพียงแค่มีวิธีการหนึ่งเช่นนั้นแทนที่จะเป็นวิธีการเฉพาะเจาะจงมากกว่า 50 ล้านวิธี ... แต่บางครั้งก็รู้สึก "ผิด" ในการคัดสิ่งที่ SQL เข้าไปในคอนโทรลเลอร์
มีวิธีที่ "ถูกต้อง" ในการรับมือกับสถานการณ์เช่นนี้หรือไม่? ดูเหมือนว่าเป็นที่ยอมรับหรือไม่ที่จะบรรจุคำค้นหาเช่นนั้นไว้ในวิธีการทั่วไป -> query ()?
มีกลยุทธ์ที่ดีกว่านี้ไหม?