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

Hah adamım geldi beni kurtardı ya 🙂 @alihankoc valla oturup eager loadingin nasıl calıstıgını aksam frameworkun çekirdeğinden gösterecektim 🙂 ama gerek kalmadı..

@coder2 dostum cache yapıyorsan kurtarırsın bir şekilde ama yolu bu değil tabi.Kendini sürekli tekrar eden bir queryden uzak tutmalısın.Demek istediğim o.Yani database de tuttuğun her bir veri için extra bir query yapacak modelin.Ve her bir modelin alt categoryleri için yapacaktır.Ne kadar alt ilişki varsa tümüyle extra query demek.Hatta olsun olmasın her bir alt query icin bile N+1 query yapacaktır modelin.Yüksek trafik alan siteler için asla yapılmayacak bir querydir bu.Ha diyorsan ben sorun yaşamıyorum yaşamamıssındır doğaldır.Yığ bakalım trafiği sitene..ve 10 binlerce alt alta kategorin olsun sisteminde..O menü geliyor mu gelmiyor mu görürsün 🙂 Ve herşeyi geçtim..Tek sefer de kullanamayacaksın bu kadar menuyu sayfaya dizmeye o yüzden query yaptığınla kalacaksın.

Sahibinden coma bakarsan eğer sadece tek alt düzeyli ilişkiyi getiriyor.Talep edildikçe ilgili datanın yine tek bir alt ilişkisini getiriyor.Ha onlarda deli gibi bir cache mekanizması var o ayrı.

Senin queryni sahibinden.com da asla calıstıramazsın.over load dan down olur sistem.

6 gün sonra

Konuyu belki hortlatmış gibi olacağım ama lazım olacak kişilere bir alternatif olsun diye yazacağım. iç içe sayısı sabit olamayan kategoriler için tek bir query ve ardından bir php fonksiyonu ile rahatça halledilebiliyor.
örnek tablo bu şekilde olursa
id|adi|parent
1|ana başlık 1|null(veya 0)
2|1. alt başlık|1
3|2. alt başlık|1
4|3. alt başlık|3
5|ana başlık 2|null

tablodaki kayıtların bu şekilde olduğunu varsayarsanız ve elde etmek istediğiniz sonuç;

  • ana başlık 1
    • 1. alt başlık
    • 2. alt başlık
      • 3. alt başlık
  • ana başlık 2

bu şekilde ise

private function createTree (&$list, $parentId = null) {
        $tree = array();
        foreach ($list as $key => $eachNode) {
            if ($eachNode['parent'] == $parentId) {
                $eachNode['children'] = $this->createTree ($list,$eachNode['id']);
                $tree[] = $eachNode;
                unset($list[$key]);
            }
        }
        return $tree;
    }

yukarıda belirttiğim fonksiyona $this->createTree($kayitlar) olarak çağırdığınızda size iç içe girmiş şekilde sonuç verecektir. Bu durumda her bir kayıt için alt kategori var mı yok mu diye kontrol etmektense tek bir sorguda sonuçları alıp ufak bir işlemle bunu sağlayabilirsiniz.

geçtiğimiz günlerde lazım olmuştu buraya iliştirmiş olayım.

    @Ekrem hocam yukarda arkadaşlar bu şekilde tüm kategorileri çekmenin performans açısından doğru olmayan bir yol olduğunu söylüyorlar.
    Anladığım kadarıyla ana kategorileri çekip listeletin, eğer kullanıcı alt kategorileri açmak isterse bir sorgu daha atarak o kategoriye ait birinci seviye alt kategorileri çekin ..... şeklinde bir mantık kurmaktan bahsediyorlar.

    Notlarım arasına yazdım, bir sonraki projemde bu şekilde deneyeceğim.

      coder2 Hocam 50-100 tane kaydı db den çekmek pek de performans kaybı sağlayacağını zannetmiyorum.

      Burada 2 mantık vardır. Menü, Katagori/Sub Kategori vs. mantığında yukarıdaki kod iş görecektir.
      Ama bir ürün filtreleme sayfasında seçilen özelliklere ait alt özellik filtreleme vs. mantığında yukarıdaki kod işe yaramaz.

      Yani eğer amaç Menü/Alt Menü - Kategori/Alt Kategoriyse olsun en fazla 250 kayıt.
      Örnek bir uygulamamda iç içe başlıkların olduğu toplamda 980 bin tane kaydın içerisinde belirli id ye göre çekip kiminde 3-5 kiminde ise 200 tane den fazla başlık çekip bu şekilde Tree oluşturuyorum hiç de sıkıntısını görmedim açıkçası.

      13 gün sonra

      Ekrem hocam bende laravel e yeni başladım kategori sistemini kullanmaya çalışıyorum. bu controller'ı yazdım ve blade kısmında çekmeye çalıştım ama beceremedim.Route da tanımlama yapmam gerekiyor galiba ama nasıl oldugunu bilmiyorum yardımcı olursanız çok sevinirim.

        Ekrem hocam şimdi şöyle yaptım ama başka bir tablo olunca index e onu yollayamıyorum bu seferde
        controller kısmı

        public function getIndex()
            {
                $kategori = Categories::all();
                return view('index', array('kategoriliste'=>$kategori));
            }

        model kısmı mesela burada iki tabloyuda çekiyim dedim olmadı

        class Categories extends Model
        {
           protected  $table = "categories";
           protected  $table2 = "sliders";
        }

        route kısmı tam burada gönderiyorum yine anasayfaya ama çakışıyor galiba yada yanlış yapıyorum hata veriyor.
        Route::get('/','CategoriesController@getIndex');