คำตอบ:
มี 5 เหตุผลในการใช้ SelectQuery
คุณกำลังสร้างคิวรีแบบไดนามิกที่มีจำนวนเงื่อนไขที่แตกต่างกันรวมเขตข้อมูลและอื่น ๆ ดูfield_read_fields ()สำหรับตัวอย่าง
คุณต้องการที่จะใช้เรียกว่าExtenders ตัวอย่างส่วนต่อขยายคือ PagerDefault (แทนที่pager_query () ) และ TableSort (แทนที่tablesort_sql () ) อนุญาตให้เพิ่มฟังก์ชันการทำงานเพิ่มเติมให้กับ SelectQuery ดูเพิ่มเติมคุณจะสร้างตารางที่เรียงลำดับได้ด้วยเพจเจอร์พร้อมข้อมูลจากตารางที่กำหนดเองได้อย่างไร . ตัวอย่าง: node_page_default ()
คุณต้องการอนุญาตให้โมดูลอื่น ๆ เปลี่ยนแบบสอบถามของคุณ จากนั้นคุณสามารถเพิ่มแท็กที่เรียกว่าและ SelectQuery จะเรียกเบ็ดแก้ไขที่เกี่ยวข้องสำหรับแท็กนั้นโดยอัตโนมัติ ฉันวางใจอย่างยิ่งกับโมดูล Privatemsg ของฉัน (เราได้ทำเช่นนั้นใน D6 ด้วยเครื่องมือสร้างแบบสอบถามที่กำหนดเอง)
หากคุณต้องการ / จำเป็นต้องใช้ระบบ node_access เพื่อแสดงเฉพาะโหนดที่ผู้ใช้ได้รับอนุญาตให้ดู เพียงเพิ่มแท็ก 'node_access' ลงใน $ query ของคุณ สิ่งนี้แทนที่ db_rewrite_sql ()
SelectQuery มีคุณสมบัติบางอย่างที่ช่วยให้รหัสของคุณทำงานเหมือนกันในฐานข้อมูลที่รองรับทั้งหมด ตัวอย่างเช่นมีSelectQuery :: orderRandom () และหากคุณมีเงื่อนไข LIKE -> condition ('field', $ value, 'LIKE') จะทำให้แน่ใจว่าเป็นการเปรียบเทียบแบบตัวเล็กและตัวพิมพ์ใหญ่เสมอ ใน D6 คุณต้องใช้ LOWER () สำหรับสิ่งที่ช้ากว่ามาก แต่ AFAIK ตอนนี้มีไม่เกินสองอันนี้
หากไม่มีเหตุผลเหล่านี้ใช้สำหรับกรณีเฉพาะให้ใช้ db_query ()
เอกสารเกี่ยวกับการdb_query()
พูดว่า:
ใช้ฟังก์ชั่นนี้สำหรับการสืบค้น SELECT หากมันเป็นเพียงสตริงการสืบค้นธรรมดา หากผู้เรียกหรือโมดูลอื่นจำเป็นต้องเปลี่ยนแบบสอบถามให้ใช้ db_select () แทน
ฉันมักจะใช้ db_select เพราะฉันชอบความสามารถในการอ่านการบำรุงรักษาและความเข้ากันได้ของฐานข้อมูลมากกว่าการเพิ่มประสิทธิภาพเล็กน้อย นอกจากนี้ฉันคิดว่าตัวเลขที่ให้ไว้ในปัญหาดังกล่าวให้ภาพที่ไม่ถูกต้องของประสิทธิภาพโดยรวม เรากำลังพูดถึงความแตกต่าง 300 ไมโครวินาทีในการค้นหาว่าเมื่อส่งคืนมากกว่าหนึ่งคอลัมน์มักจะทำงานในช่วงหลายมิลลิวินาที และฉันจะไม่แปลกใจหากมีค่าใช้จ่ายเพียง 1 ครั้งเท่านั้น (การโหลดคลาส) และทำให้ความแตกต่างสำหรับคำขอเต็ม (หน้า) นั้นน้อยกว่ามาก