วิธีใช้คำสั่งซื้อโดยสำหรับหลายคอลัมน์ใน Laravel 4


231

ฉันต้องการเรียงลำดับหลายคอลัมน์ใน Laravel 4 โดยใช้วิธีorderBy()ใน Laravel Eloquent แบบสอบถามจะถูกสร้างขึ้นโดยใช้ Eloquent ดังนี้:

SELECT *
FROM mytable
ORDER BY
  coloumn1 DESC, coloumn2 ASC

ฉันจะทำสิ่งนี้ได้อย่างไร


ง่ายมาก. User::orderBy('name', 'DESC') ->orderBy('email', 'ASC') ->get();
ฉันเป็นคนที่โง่ที่สุดที่

คำตอบ:


373

เพียงแค่เรียกorderBy()หลาย ๆ ครั้งตามที่คุณต้องการ ตัวอย่างเช่น

User::orderBy('name', 'DESC')
    ->orderBy('email', 'ASC')
    ->get();

สร้างแบบสอบถามต่อไปนี้:

SELECT * FROM `users` ORDER BY `name` DESC, `email` ASC

16
มันคงจะดีถ้าเราสามารถผ่านอาเรย์เช่น: User::orderBy(array('name'=>'desc', 'email'=>'asc'))
JoshuaDavid

10
@FireCoding คุณสามารถทำได้$user->orders = array(array('column' => 'name', 'direction' => 'desc'), array('column' => 'email', 'direction' => 'asc'));
rmobis

มีวิธีเพิ่มคำสั่งซื้อโดยใช้แบบสอบถามที่สร้างขึ้นหรือไม่
Rafael

@Rafael ถ้าคุณยังไม่ได้รันมัน (เรียกว่าgetหรือfirst) เพียงแค่เรียกorderByมัน อื่นไม่
rmobis

มิฉะนั้นหากคุณจำเป็นต้องเรียงลำดับจากมากไปน้อยคุณสามารถใช้ล่าสุด () ได้เช่นกัน
ssi-anik

30

คุณสามารถทำตามที่ @rmobis ได้ระบุไว้ในคำตอบของเขา [การเพิ่มบางอย่างเข้าไปในนั้น]

ใช้order byสองครั้ง:

MyTable::orderBy('coloumn1', 'DESC')
    ->orderBy('coloumn2', 'ASC')
    ->get();

และวิธีที่สองที่จะทำคือ

การใช้raw order by:

MyTable::orderByRaw("coloumn1 DESC, coloumn2 ASC");
    ->get();

ทั้งสองจะสร้างแบบสอบถามเดียวกันดังนี้

SELECT * FROM `my_tables` ORDER BY `coloumn1` DESC, `coloumn2` ASC

ตามที่ @rmobis ระบุไว้ในความคิดเห็นของคำตอบแรกคุณสามารถส่งผ่านอาร์เรย์เพื่อเรียงลำดับตามคอลัมน์เช่นนี้

$myTable->orders = array(
    array('column' => 'coloumn1', 'direction' => 'desc'), 
    array('column' => 'coloumn2', 'direction' => 'asc')
);

อีกวิธีที่จะทำคือการiterateวนซ้ำ

$query = DB::table('my_tables');

foreach ($request->get('order_by_columns') as $column => $direction) {
    $query->orderBy($column, $direction);
}

$results = $query->get();

หวังว่าจะช่วย :)


ฉันสามารถใช้ orderByRaw และ orderBy ร่วมกันได้หรือไม่ ดูเหมือนจะไม่ได้ผลสำหรับฉันข้อความค้นหาที่เกิดขึ้นดูเหมือนจะเคารพ orderByRaw เท่านั้น
Return-1

ลองใส่คำสั่งซื้อก่อนแล้วจึงสั่ง ByRaw และดูผลลัพธ์ @GeorgeAvgoustis
Sagar Naliyapara

น่าเสียดายที่สิ่งนี้ไม่สามารถทำได้เนื่องจากต้องมีการสุ่มก่อนแล้วจึงสั่งซื้อโดยการคัดเลือกขั้นสุดท้าย
Return-1

1
อาจทำงานร่วมกันอาจเป็นเพราะการใช้การเรียงลำดับคอลัมน์แรกคุณไม่สามารถดูการเรียงลำดับคอลัมน์ที่สองได้
Sagar Naliyapara

3

นี่คืออีกดอดจ์ที่ฉันเกิดขึ้นสำหรับคลาสที่เก็บพื้นฐานของฉันที่ฉันต้องการสั่งซื้อด้วยจำนวนคอลัมน์โดยพลการ:

public function findAll(array $where = [], array $with = [], array $orderBy = [], int $limit = 10)
{
    $result = $this->model->with($with);
    $dataSet = $result->where($where)
        // Conditionally use $orderBy if not empty
        ->when(!empty($orderBy), function ($query) use ($orderBy) {
            // Break $orderBy into pairs
            $pairs = array_chunk($orderBy, 2);
            // Iterate over the pairs
            foreach ($pairs as $pair) {
                // Use the 'splat' to turn the pair into two arguments
                $query->orderBy(...$pair);
            }
        })
        ->paginate($limit)
        ->appends(Input::except('page'));

    return $dataSet;
}

ตอนนี้คุณสามารถโทรออกดังนี้

$allUsers = $userRepository->findAll([], [], ['name', 'DESC', 'email', 'ASC'], 100);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.