Laravel Türkiye Discord Kanalı Forumda kod paylaşılırken dikkat edilmesi gerekenler!Birlikte proje geliştirmek ister misiniz?

Merhabalar. Yapmış olduğum bir proje var ve Sınırsız kategorileme mantığında gittim.

ID, Kategori, USTID şeklinde bir veritabanı yapım var. USTID değeri 0 olanlar ana kategoriler oluyor. USTID 0 dan farklı olanlar o kategoriye bağlı olmuş oluyor.

Burada ki sıkıntım şu USTID'si 0 olan yani Ana kategori seçilince altındaki bütün kategorilerin ürünlerini çektirmeye çalışıyorum. Bunun mantığını bir türlü anlayamadım yardımcı olursanız sevinirim. Şimdiden teşekkürler.

Kullandığınız yöntemin adı Adjacency List olarak geçiyor ve ne yazık ki hızlı bir yolu yok. Araştırmanız gerekiyor.

Mobilden yazdigim icin koda dokemem ancak kurgu olarak sunu yapabilirsin, once Ana kategorinin id si USTID de olanlarin select ile id lerini alirsin, sonra urun tablosuna veya ara tabloya whereIn ile kategorilerin id lerini koyarak sorgu yapabilirsin. Her kategoriye gittiginde alt kategorilere ait urunlerde gelecektir.

    ac1919 Ne yazık ki o kadar kolay değil. Recursive işlem yapılması gerekiyor çünkü bir kategorinin kaç seviyede (derinlik) alt kategorisi olduğunu bilmiyoruz. Örneğin verilen bir kategorinin tüm alt kategorilerini recursive bir şekilde almak istiyorsa şöyle bir sorgu kullanması gerekecek:

    # Alt kategorileri bulunacak olan  üst kategori
    SET @kategori = 5;
    
    SELECT
          ID,
          Kategori,
          USTID
    FROM
          (SELECT * FROM kategoriler ORDER BY USTID, ID) k1,
          (SELECT @ID := @kategori) k2
    WHERE
          (FIND_IN_SET(USTID, @ID) OR ID = @ID)
    AND
          LENGTH(@ID := CONCAT(@ID, ',', ID));

    MySQL 8+ ise:

    # Alt kategorileri bulunacak olan  üst kategori
    SET @kategori := 5;
    
    WITH RECURSIVE altkategoriler AS
    (
        SELECT
            ID,
            Kategori,
            USTID
        FROM
            kategoriler
        WHERE
            ID = @kategori
        UNION ALL
        SELECT
            k1.ID,
            k1.Kategori,
            k1.USTID
        FROM
            altkategoriler AS k2
        JOIN 
            kategoriler AS k1 ON k2.ID = k1.USTID
    )
    
    SELECT * FROM altkategoriler ORDER BY USTID, ID;

    Bu şekilde kategori ID'lerini alacak ve ürünler tablosunda da WHERE IN ile kategori id'sini tutan alanda sorgu yapacak.

    Bu işi bir de PHP tarafında yapmak var ama orada da pek değişen bir durum yok, yine recursive işlem yapması lazım ya da referans değişkenler vs kullanarak kayıtlar üzerinden geçip bir değişkene id leri dolduracak.

      mgsmus Kolay degil mustafa kesinlikle ben sadece kurgudan bahsettim kod icin tesekkurler bu arada.

        ac1919 ama eğer örneğin en fazla 3 derinlikte kategori olabilir şeklinde bir sınırlama olsaydı aynı tabloya 3 kere kendi içinde JOIN yapılarak kolay halledilirdi.

        MySQL 8 bu recursive özelliği ile bu tür işleri bayağı kolaylaştırmış ama performans nasıl tecrübe etmediğim için bilmiyorum. Şu aşamada kayıtlar hızlıca çekilip PHP ile mi yapılmalı yoksa SQL düzeyinden halledilip kolay kısım PHP ile mi yapılmalı karar veremiyorum. Tecrübeli bir arkadaşın bizi aydınlatmasını isterim.

        Açıkçası ben sql ile yapılması taraftarıyım. Çünkü performans olarak php'de ve diğer dillerde gördüğüm döngünün içine soktuğumuz zaman data büyüdükçe aşırı bir yavaşlama geliyor. Ondan dolayı belki regulations'lar ile yapabilir diye buraya konu açtım. Ama şunu da merak etmiyor değilim. Büyük projelerde bu sorunu nasıl aşıyorlar. Bende merakla bekliyorum.

        Ayrıca yardımcı olmaya çalışan arkadaşlara teşekkürler.