Sıralama
Strapi, bir ilişki listesini yeniden sıralamanıza olanak tanır.
Bu sıralama özelliği, İçerik Yöneticisi ve API'de mevcuttur.
Kod Konumu
packages/core/database/lib/entity-manager/relations-orderer.js
Sıra DB'de nasıl saklanır?
- İlişkinin sıralama değerini
order
alanında saklıyoruz. - Çift yönlü ilişkiler için, diğer tarafın sıralama değerini
inverse_order
alanında saklıyoruz.
Tüm ilişki türleri için sıralama değerlerini saklıyoruz, ancak istisnalar:
- Polimorfik ilişkiler (uygulamak için çok karmaşık).
- Birbirine tek yönlü ilişkiler (çünkü her çift için yalnızca bir ilişki vardır).
Çoktan Çoğa (Adresler <-> Kategoriler)
category_order
, bir adres varlığındaki kategoriler ilişkilerinin sıralama değeridir.address_order
, bir kategori varlığındaki adresler ilişkilerinin sıralama değeridir.
Tek Yönlü (Kişisel Havuzlar <-> Etiketler)
- Her çift için yalnızca bir ilişki olduğundan
order
alanı yoktur.
Tek Yönlü İlişki (Restoranlar <-> Kategoriler)
Bir restoranın birçok kategorisi olduğu durumda:
category_order
, bir restoran varlığındaki kategoriler ilişkilerinin sıralama değeridir.- Tek yönlü bir ilişki olduğu için
restaurant_order
yoktur.
DB katmanında ilişkileri nasıl sıralarız?
Daha fazla bilgi için Strapi Dokümanları bakın.
Veritabanı katmanı, aşağıda gösterilen bir yük almalıdır:
category: {
connect: [
{ id: 6, position: { after: 1} }, // İlişki id=1'den sonra olmalıdır
{ id: 8, position: { end: true }}, // Sona yerleştirilmelidir
],
disconnect: [
{ id: 4 }
]
}
İlişkilerin sıralaması nasıl çalışır?
Kesirli indeksleme kullanıyoruz. Bu, ilişkileri sıralamak için ondalık sayılar kullandığımız anlamına gelir. Daha ayrıntılı bir anlayış için aşağıdaki diyagramlara bakın.
Basit örnek
Karmaşık örnek
Algoritma adımları
connect
dizisinden:
- Her bir öğe için, id ile ilişkileri yükleyin,
after
veyabefore
alanlarından. after
vebefore
ilişkilerine dayanarak hesaplamaya başlayın:- Başlangıç ile
after
/before
ilişkileriyle (adım 1). Bunlara başlangıç ilişkileri diyelim. connect
dizisinden güncellemeleri sırasıyla uygulayın.- Güncelleme
before
türündeyse:- Belirtilen öğenin listede önüne yerleştirilecektir.
- Eğer belirtilen öğe bir
init relation
ise, o öğeyi o ilişkinin ve önündekinin arasına yerleştirin.- Sıralama değerini belirlemek için, order = beforeRelation.order - 0.5. Bu, öğenin
before
ilişkisinden önce ve ondan önce gelenin ardından yerleştirilmesini sağlar.
- Sıralama değerini belirlemek için, order = beforeRelation.order - 0.5. Bu, öğenin
- Aksi halde order = beforeRelation.order
- Güncelleme
after
türündeyse:- Belirtilen öğenin listede ardına yerleştirilecektir.
- Eğer belirtilen öğe bir
init relation
ise, o öğeyi o ilişkinin ve ardından gelenin arasına yerleştirin.- Sıralama değerini belirlemek için, order = beforeRelation.order + 0.5. Bu, öğenin
after
ilişkisi öncesi ve ardından gelenin önüne yerleştirilmesini sağlar.
- Sıralama değerini belirlemek için, order = beforeRelation.order + 0.5. Bu, öğenin
- Aksi halde order = beforeRelation.order
- Güncelleme
end
türündeyse:- Sona yerleştirin
- Eğer bir init relation'dan sonra yerleştiriliyorsa: order = lastRelation.order + 0.5
- Aksi halde order = lastRelation.order
- Sona yerleştirin
- Güncelleme
start
türündeyse:- Başlangıca yerleştirin
- order = 0.5
before/after
: Eğer id mevcut dizide yoksa, hata fırlatın- Eğer bir id bu dizide zaten mevcutsa, öncekini kaldırın
- Güncelleme
- Başlangıç ile
- Sıralama değerine göre gruplama yapın ve başlangıç ilişkilerini dikkate almayın
- Her grup için sıralama değerlerini yeniden hesaplayın, böylece tekrar eden numaralar yoktur ve aynı sırayı koruyabilirler.
- Örnek :
[ {id: 5 , order: 1.5}, {id: 3, order: 1.5 } ]
→[ {id: 5 , order: 1.33}, {id: 3, order: 1.66 } ]
- Örnek :
- Değerleri veritabanına ekleyin
- Veritabanındaki sıralamayı, sıralama pozisyonlarına göre güncelleyin. (ROW_NUMBER() ifadesini kullanarak)
- Her grup için sıralama değerlerini yeniden hesaplayın, böylece tekrar eden numaralar yoktur ve aynı sırayı koruyabilirler.
disconnect
dizisinden:
- Veritabanından ilişkileri silin.
- Kalan öğeleri veritabanında sıralama pozisyonlarına göre, ROW_NUMBER() ifadesini kullanarak yeniden sıralayın.