เรียงลำดับตามหลายคอลัมน์ด้วยหลักคำสอน


115

ฉันต้องการเรียงลำดับข้อมูลตามสองคอลัมน์ (เมื่อแถวมีค่าต่างกันสำหรับคอลัมน์หมายเลข 1 ให้เรียงลำดับตามนั้นมิฉะนั้นเรียงลำดับตามคอลัมน์หมายเลข 2)

ฉันใช้QueryBuilderเพื่อสร้างแบบสอบถาม

หากฉันเรียกorderByวิธีนี้เป็นครั้งที่สองจะแทนที่คำสั่งที่ระบุไว้ก่อนหน้านี้

ฉันสามารถส่งสองคอลัมน์เป็นพารามิเตอร์แรก:

->orderBy('r.firstColumn, r.secondColumn', 'DESC');

แต่ฉันไม่สามารถส่งสองทิศทางการสั่งซื้อสำหรับพารามิเตอร์ที่สองได้ดังนั้นเมื่อฉันดำเนินการสืบค้นนี้คอลัมน์แรกจะถูกเรียงลำดับจากน้อยไปมากและคอลัมน์ที่สองจากมากไปหาน้อย ฉันต้องการใช้จากมากไปหาน้อยสำหรับทั้งสองคน

มีวิธีทำโดยใช้QueryBuilderไหม ฉันจำเป็นต้องใช้ DQL หรือไม่?

คำตอบ:


213

คุณต้องเพิ่มทิศทางการสั่งซื้อหลังชื่อคอลัมน์:

$qb->orderBy('column1 ASC, column2 DESC');

ดังที่คุณได้ระบุไว้การโทรหลายครั้งจะorderBy ไม่ซ้อนกัน แต่คุณสามารถโทรหลายสายไปที่addOrderBy:

$qb->addOrderBy('column1', 'ASC')
   ->addOrderBy('column2', 'DESC');

2
ขอบคุณ ฉันไม่ได้สังเกตเห็นสิ่งนี้มาก่อน ฉันคิดว่าสองคำสั่งโดยคำสั่งนี้ใช้ได้ ดังนั้นฉันไม่ได้ตระหนักถึงวิธีการ addOrderBy ไชโยเพื่อชี้ให้เห็น :)

Diego Agulló: น่าเสียดายที่ลิงก์ทั้งสองในคำตอบของคุณไม่ทำงานอีกต่อไป
k00ni

1
@ k00ni ขอบคุณที่ชี้ให้เห็น ฉันอัปเดตเอกสารเก่าเป็นเอกสารล่าสุด แต่ไม่พบปัญหาการย้ายข้อมูล DC-909 บน GitHub ดังนั้นฉันจึงลบเอกสารฉบับหลังออก
Diego Agulló

alias.column_nameสำหรับผู้สร้างแบบสอบถามกับนามแฝงตารางไม่ลืมที่จะเพิ่ม
Maulik Parmar

16

ในหลักคำสอน 2.x คุณไม่สามารถส่งหลายลำดับโดยใช้หลักคำสอน 'orderBy' หรือ 'addOrderBy' ดังตัวอย่างข้างต้น เพราะมันจะเพิ่ม 'ASC' ที่ท้ายชื่อคอลัมน์สุดท้ายโดยอัตโนมัติเมื่อคุณปล่อยพารามิเตอร์ที่สองว่างไว้เช่นในฟังก์ชัน 'orderBy'

ตัวอย่าง->orderBy('a.fist_name ASC, a.last_name ASC')จะแสดงผล SQL เช่นนี้ 'ORDER BY first_name ASC, last_name ASC ASC' นี่คือข้อผิดพลาดทางไวยากรณ์ SQL เพียงเพราะค่าเริ่มต้นของ orderBy หรือ addOrderBy คือ 'ASC'

หากต้องการเพิ่มคำสั่งซื้อหลายรายการคุณต้องใช้ฟังก์ชัน 'เพิ่ม' และจะเป็นแบบนี้

->add('orderBy','first_name ASC, last_name ASC'). สิ่งนี้จะทำให้คุณมีรูปแบบ SQL ที่ถูกต้อง

ข้อมูลเพิ่มเติมเกี่ยวกับฟังก์ชัน add () https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/query-builder.html#low-level-api

หวังว่านี่จะช่วยได้ ไชโย!



0

ความคิดเห็นสำหรับorderByซอร์สโค้ดหมายเหตุ: Keys are field and values are the order, being either ASC or DESC.. orderBy->(['field' => Criteria::ASC])ดังนั้นคุณสามารถทำได้


สิ่งนี้ไม่ถูกต้อง ดูคำตอบของฉันด้านบน
Thomas Hansen

0

orderByวิธีการต้องมีทั้งสองสายหรือExpr\OrderByวัตถุ หากคุณต้องการเพิ่มการประกาศคำสั่งซื้อหลายรายการสิ่งที่ถูกต้องคือการใช้addOrderByวิธีการหรือสร้างอินสแตนซ์ของOrderByวัตถุและเติมข้อมูลตามนั้น:

   # Inside a Repository method:
   $myResults = $this->createQueryBuilder('a')
       ->addOrderBy('a.column1', 'ASC')
       ->addOrderBy('a.column2', 'ASC')
       ->addOrderBy('a.column3', 'DESC')
   ;

   # Or, using a OrderBy object:
   $orderBy = new OrderBy('a.column1', 'ASC');
   $orderBy->add('a.column2', 'ASC');
   $orderBy->add('a.column3', 'DESC');

   $myResults = $this->createQueryBuilder('a')
       ->orderBy($orderBy)
   ;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.