• 07-02-2019, 14:32:58
    #1
    Üyeliği durduruldu
    Laravelde scriptimiz var sistemde en çok referansa sahip 5 kişiyi listelemek istiyorum bir türlü beceremedim.

    @php
    $plans = AppUser::where('under_reference', 2)->count();
     @endphp
    
    {{ $plans }} Referans
    Bu şekilde ID'si 2 olan üyenin 9 tane referansı olduğunu çekebiliyorum.

    Bana şöyle lazım;
    En çok referansa sahip ilk 5 ve kaç ref olduğuda yanında yazacak
  • 07-02-2019, 14:39:37
    #2
    MeteOguzhan adlı üyeden alıntı: mesajı görüntüle
    Laravelde scriptimiz var sistemde en çok referansa sahip 5 kişiyi listelemek istiyorum bir türlü beceremedim.

    @php
    $plans = AppUser::where('under_reference', 2)->count();
     @endphp
    
    {{ $plans }} Referans
    Bu şekilde ID'si 2 olan üyenin 9 tane referansı olduğunu çekebiliyorum.

    Bana şöyle lazım;
    En çok referansa sahip ilk 5 ve kaç ref olduğuda yanında yazacak
    Hocam öncelikle template kısmına php kodu yazıyorsunuz MVC mimarisi için yanlış bir durum onu belireteyim controllera yazıp template injection yapmanız lazım.Yapılacak iş şu şekide HAS MANY relation kurmanız gerekmektedir.Daha sonra relation yaptığınız fonksiyonda ki ->count obejsini çağırmalısınız.Neden size yazamıyorum çünkü sistemi nasıl yazdığını bilemiyorum daha detay verirseniz yardımcı olurum



    -----------------------------------------------

    Eğer bilginiz yeterliyse üye sayıları cachede tutun hemen direk çekebilirsiniz
  • 07-02-2019, 14:47:12
    #3
    Üyeliği durduruldu
    Loren adlı üyeden alıntı: mesajı görüntüle
    Hocam öncelikle template kısmına php kodu yazıyorsunuz MVC mimarisi için yanlış bir durum onu belireteyim controllera yazıp template injection yapmanız lazım.Yapılacak iş şu şekide HAS MANY relation kurmanız gerekmektedir.Daha sonra relation yaptığınız fonksiyonda ki ->count obejsini çağırmalısınız.Neden size yazamıyorum çünkü sistemi nasıl yazdığını bilemiyorum daha detay verirseniz yardımcı olurum



    -----------------------------------------------

    Eğer bilginiz yeterliyse üye sayıları cachede tutun hemen direk çekebilirsiniz

    Hocam örnek bir kod yazabilir misiniz acaba ?
    under_reference kolonunda üye idleri var

    under_reference 2 olanları listele dediğimde

    under_reference":"2"
    under_reference":"2"
    under_reference":"2"
    under_reference":"2"
    under_reference":"2"
    under_reference":"2"
    under_reference":"2"
    under_reference":"2"

    böyle listeliyor 2 olanları yani bu kadar üye ID 2 olan üyenin alt üyesiymiş

    Ama benim istediğim tüm üyelerde kontrol yapsın o kısmı beceremedim
  • 07-02-2019, 15:02:22
    #4
    @MeteOguzhan;
    Şu sorgu işinizi görecektir.
    ister raw olarak kullanın ister query builder ile,

    $query = "SELECT *, COUNT(*) as total FROM user GROUP BY under_reference HAVING under_reference IS NOT NULL order by total DESC";
    --edit:

    Yukarda under_reference is not null u kullanmamın sebebi, benim db yapımdaki userların eğer referansı yok ise under_reference columnu null oluyor, eğer siz böyle değilde direk 0 veriyorsanız under_reference kolonuna;
    bu durumda HAVING under_reference > 0 demeniz lazım ki, sadece referans ile gelen kayitları alabilesiniz.


    --edit 2:

    sorgu sonuna (DESC den sonra) *LIMIT 5* diyerek sadece 5 kaydı alabilirsiniz


    --edit 3:
    Bu sorguda en cok referans sahibi userlar donmuyor, sadece id leri under_reference altinda donuyor, dolayısı ile siz appUser modelinize relation tanımlayıp, yukardaki sorgudan donen sonucların sahibi olan userlari cekmeniz lazim.
    Ornek:

    $records = AppUser::getHighestReferences();
    
    foreach($records as $record) {
        echo    "{$record->ownerReference->full_name} <br/>";
    }
    bu sadece ornekti gerisi size kalmis bir olay.
  • 07-02-2019, 17:04:25
    #5
    Üyeliği durduruldu
    teşekkür ederim öncelikle Mysql query ile olmuyor laravelde hocam

    Wtapostar adlı üyeden alıntı: mesajı görüntüle
    @MeteOguzhan;
    Şu sorgu işinizi görecektir.
    ister raw olarak kullanın ister query builder ile,

    $query = "SELECT *, COUNT(*) as total FROM user GROUP BY under_reference HAVING under_reference IS NOT NULL order by total DESC";
    --edit:

    Yukarda under_reference is not null u kullanmamın sebebi, benim db yapımdaki userların eğer referansı yok ise under_reference columnu null oluyor, eğer siz böyle değilde direk 0 veriyorsanız under_reference kolonuna;
    bu durumda HAVING under_reference > 0 demeniz lazım ki, sadece referans ile gelen kayitları alabilesiniz.


    --edit 2:

    sorgu sonuna (DESC den sonra) *LIMIT 5* diyerek sadece 5 kaydı alabilirsiniz


    --edit 3:
    Bu sorguda en cok referans sahibi userlar donmuyor, sadece id leri under_reference altinda donuyor, dolayısı ile siz appUser modelinize relation tanımlayıp, yukardaki sorgudan donen sonucların sahibi olan userlari cekmeniz lazim.
    Ornek:

    $records = AppUser::getHighestReferences();
    
    foreach($records as $record) {
        echo    "{$record->ownerReference->full_name} <br/>";
    }
    bu sadece ornekti gerisi size kalmis bir olay.
  • 07-02-2019, 17:15:56
    #6
    MeteOguzhan adlı üyeden alıntı: mesajı görüntüle
    teşekkür ederim öncelikle Mysql query ile olmuyor laravelde hocam
    rica ederim, mysql query i örnek olması acısından verdim, DB::statement() ile raw query dediğimiz sorguları çalıştırabilirsiniz, olmuyor değil yani, oluyor

    Burda raw query kullanmamalısınız zaten, relationları yüklemeniz için eloquent veya querybuilder kullanmanız lazım.

    Sorguyu örnek olması açısından attım zaten, bunu en son editte yazdıgım appUser modeli altında getHighestReferences metodu oluşturup, içine querybuilder e donusturup yazabilirsiniz.
  • 07-02-2019, 17:22:43
    #7
    Üyeliği durduruldu
    bu kadar laravel bilgim ile bunu beceremeyeceğim anlasılan
    Wtapostar adlı üyeden alıntı: mesajı görüntüle
    rica ederim, mysql query i örnek olması acısından verdim, DB::statement() ile raw query dediğimiz sorguları çalıştırabilirsiniz, olmuyor değil yani, oluyor

    Burda raw query kullanmamalısınız zaten, relationları yüklemeniz için eloquent veya querybuilder kullanmanız lazım.

    Sorguyu örnek olması açısından attım zaten, bunu en son editte yazdıgım appUser modeli altında getHighestReferences metodu oluşturup, içine querybuilder e donusturup yazabilirsiniz.
  • 07-02-2019, 17:43:58
    #8
    MeteOguzhan adlı üyeden alıntı: mesajı görüntüle
    bu kadar laravel bilgim ile bunu beceremeyeceğim anlasılan
    Basit bir kod atacagim, tablo ismi users, ad soyad kolon isimleri => first_name, last_name oldugunu varsayin, siz tablo adinizi ve alanlari kendi tablonuza gore duzenleyin, yorum satirlarinda belirtecegim zaten.

    takildiginiz bir sey olursa cekinmeden sorabilirsiniz.

    $users = AppUser::all(); // tum userlari aldik
    
    // userlari atayacigimiz dizi, eslestirme yaparken her seferinde sorgu atmayalim, bu diziden cekelim.
    $userMap = [];
    
    // en fazla referansa sahip olan userlari bu dizide toplayacagiz, dizide 3 alan olacak. 1 => first_name, 2 => last_name, 3 => references_count (totalde referans sayisi)
    $highestReferences = [];
    
    // sistemdeki userlari donup, $userMap tablomuza ekliyoruz
    foreach($users as &$u) {    
        $userMap[$u->id] = $u;
    }
    
    
    /* kullanici tablosundan en cok referansa sahip kayitlari sorgular, donen sonuctaki under_reference degeri ilede referans sahibi kullaniciyi bulacagiz.
    * HAVING under_reference IS NOT NULL sorgusu referanssiz kayit olanlari dahil etmemek icin, eger siz null yerine 0 ile dolduruyorsanız referanssiz kayit olanlari sorguyu soyle degistirin (asagida)
    * HAVING under_reference > 0
    **/
    $results  = DB::select('SELECT *, COUNT(*) as total FROM users GROUP BY under_reference HAVING under_reference IS NOT NULL order by total DESC LIMIT 5');
    
    // yukardaki sorgudan donen kayitlari donelim ve referansa sahip user ile eslestirelim.
    foreach($results  as  $result) {    
        $user = isset($userMap[$result->under_reference]) ? $userMap[$result->under_reference] : false;
      
      // eger referans sahibi user , kayitlarimizda yoksa es gecelim.  
       if (!$user) continue;  
    
    
     /* referansın sahibini asagidaki diziye ekleyelim    
      * (first_name, last_name alanlari users tablosundan gelecek [sizde farkliysa kendinize gore duzenleyin kodu], $result->total ise yukardaki sorguda count unu aldigimiz referans toplami olacak)  
     **/    
    $highestReferences[] = [      
         'first_name' => $user->first_name,
         'last_name' => $user->last_name,    
         'references_count' => $result->total    
       ];
    
    }
    
    
    // burda ise olusturdugumuz veriyi dumpluyoruz, dogru sonucu gormus olmamiz gerek. 
    // siz listelemek icin asagidaki diziyi viewa gonderip, foreach icinde listeletebilirsiniz.
    dd($highestReferences);