Doctrine ile birden çok sütuna göre sıralama


115

Verileri iki sütuna göre sıralamam gerekiyor (satırlar sütun numarası 1 için farklı değerlere sahipse ona göre sırala; aksi takdirde sütun numarası 2'ye göre sırala)

QueryBuilderSorguyu oluşturmak için a kullanıyorum .

orderByYöntemi ikinci kez çağırırsam, önceden belirtilen sıralamaların yerini alır.

İlk parametre olarak iki sütun geçirebilirim:

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

Ancak ikinci parametre için iki sıralama yönünü iletemiyorum, bu nedenle bu sorguyu yürüttüğümde ilk sütun artan bir yönde ve ikinci sütun azalan şekilde sıralanır. Her ikisi için de alçalan kullanmak istiyorum.

Bunu kullanarak yapmanın bir yolu var mı QueryBuilder? DQL kullanmam gerekiyor mu?

Yanıtlar:


213

Sütun adının hemen sonrasına sipariş yönünü eklemelisiniz:

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

Daha önce de belirttiğiniz gibi, birden fazla çağrının üst orderBy üste yığılmaması için birden fazla çağrı yapabilirsiniz, ancak aşağıdakilere birden çok çağrı yapabilirsiniz addOrderBy:

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

2
Teşekkürler. bunu daha önce fark etmemiştim. Bunun için iki orderBy ifadelerinin uygun olduğunu düşündüm. bu yüzden addOrderBy yöntemini fark etmedim. işaret

Diego Agulló: Maalesef cevabınızdaki her iki bağlantı da artık çalışmıyor.
k00ni

1
@ k00ni bunu işaret ettiğiniz için teşekkürler. İlkini en son dokümanlara güncelledim, ancak DC-909 taşınan sorununu GitHub'da bulamadım, bu yüzden ikincisini kaldırdım.
Diego Agulló

Tablo takma adına sahip sorgu oluşturucular için eklemeyi unutmayın alias.column_name.
Maulik Parmar

16

Doctrine 2.x'te, yukarıdaki örneklerde olduğu gibi 'orderBy' veya 'addOrderBy' doktrini kullanarak birden fazla sipariş geçemezsiniz. Çünkü, ikinci parametreyi boş bıraktığınızda, 'orderBy' işlevinde olduğu gibi, otomatik olarak son sütun adının sonuna 'ASC'yi ekler.

Bir örnek için ->orderBy('a.fist_name ASC, a.last_name ASC')SQL'e şöyle bir çıktı verilecektir: 'SİPARİŞ TARAFINDAN ad ASC, son_ad ASC ASC'. Yani bu SQL sözdizimi hatasıdır. Bunun nedeni, orderBy veya addOrderBy'nin varsayılan değerinin 'ASC' olmasıdır.

Birden fazla sipariş eklemek için 'ekle' işlevini kullanmanız gerekir. Ve böyle olacak.

->add('orderBy','first_name ASC, last_name ASC'). Bu size doğru biçimlendirilmiş SQL'i verecektir.

Add () işlevi hakkında daha fazla bilgi. https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/query-builder.html#low-level-api

Bu yardımcı olur umarım. Şerefe!


8

kullanabilirsiniz ->addOrderBy($sort, $order)

Ekle: Doctrine Querybuilder btw. genellikle normal yöntemlerin "özel" değişikliklerini kullanır, bkz select-addSelect. where-andWhere-orWhere, groupBy-addgroupBy...


0

İçin açıklama orderBykaynak kodu notlar: Keys are field and values are the order, being either ASC or DESC.. Yani yapabilirsin orderBy->(['field' => Criteria::ASC]).


Bu doğru değil. Yukarıdaki
Thomas Hansen

0

orderByBu metod ya iki ip ya da bir gerektirir Expr\OrderBynesne. Birden fazla sipariş bildirimi eklemek istiyorsanız, doğru olan, addOrderByyöntemi kullanmak veya bir OrderBynesneyi başlatıp buna göre doldurmaktır:

   # 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)
   ;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.