• 10-08-2018, 14:27:09
    #1
    Merhabalar,

    Ürünler - products
    Kategoriler - categories
    Ürün Kategorileri Pivot Tablo - product_category

    Dinamik ürün varyasyonları yapmak istiyorum. Bunun için 2 tablo oluşturdum.

    product_option ve product_variant

    Variant Kısmında Örnek olarak: Renk, Boyut, Ekran Çözünürlüğü vb. gibi ürüne ait bilgiler oluşturuyorum. Sadece isimler.
    Option kısmında ise, ProductID, VariantID, ve değer giriyorum. Örnek olarak 2 numaralı ürün, 1 numaralı Variant ve Değer(Kırmızı)

    Daha sonra Görselde sağ kısımda bunları listeliyorum fakat filtrelemeyi başarılı olarak yapamadım. Bununla ilgili yardım edebilecek biri var mı?

    İyi Çalışmalar..
  • 10-08-2018, 14:55:05
    #2
    Tam mantığı kuramadım ama Eloquent ile yaptığında kullanacağın yöntemler şunlar oluyor. Basit bir örnek vereyim, hatalı olabilir ama belki yardımcı olur.

    Product::with('variants', 'options')->when(request('variant') && request('option'), function($query){
      return $query->whereHas('variants', function($query){
        // ..
      });
    });
    with metodu ile ürüne ait varyant ve seçenekleri alıp, when metodu ile eğer querystring de variant veya option varsa whereHas metodu ile (böyle olmayabilir de) işlem yapabilirsin.

    Çok benzemese de koşullu sorguları çözmek için bir yazı yazmıştım belki yardımcı olabilir: https://yilmazdemir.com.tr/eloquent-...sullu-sorgular
  • 10-08-2018, 15:55:58
    #3
    ​ör:filitreden renk seçtiler

    ?variant_tipi=product_option&variant_tipi=product_ option
    - variant_tipi renk olsun diyelim renk in slug benzersiz değer yapalım ona --- filitreden seçilen renk in id sini alalım
    ?renk_slug=kırmızı
    ?renk=1

    olarak get ile sorgu gönderebilirsin
    controller den sorgu yaptığın yerde ise get ile gelen verileri süzdürebilirsin

    $filitre = array('renk',)// filitreden gelen sadece bu değerleri where yapsın diye koruma
    foreach ($filitre as $key => $value) {
      if(isset($option)){
           $option = ProductOption:where($value, $_GET[$value]); 
        }else{
        if(isset($_GET[$value])){
           $option->where($value, $_GET[$value]);
        }
      }
    }
    $gelen_option = $option->get();
    
    foreach($gelen_optionas as $produc){
    $produc_ids[] =  $produc['ProductID']
    }
    burada filitrelere uyan ürünlerin id lerini elde ettik gelen id leri ürünler tablosunda wherein ile sorgutalım

      $urunler = Product:whereIn($id,$produc_ids)->get();
    yazdıklarınızdan anladığım kadar aklımda kurduğum mantık

    filitrelerin id lerini ortak tabloda aratarak gelen ürünlerin id lerinide ürünler tablosundan whereIn ile aratın
  • 10-08-2018, 16:14:21
    #4
    OnurTasci adlı üyeden alıntı: mesajı görüntüle
    ör:filitreden renk seçtiler

    ?variant_tipi=product_option&variant_tipi=product_ option
    - variant_tipi renk olsun diyelim renk in slug benzersiz değer yapalım ona --- filitreden seçilen renk in id sini alalım
    ?renk_slug=kırmızı
    ?renk=1

    olarak get ile sorgu gönderebilirsin
    controller den sorgu yaptığın yerde ise get ile gelen verileri süzdürebilirsin

    $filitre = array('renk',)// filitreden gelen sadece bu değerleri where yapsın diye koruma
    foreach ($filitre as $key => $value) {
      if(isset($option)){
           $option = ProductOption:where($value, $_GET[$value]);
        }else{
        if(isset($_GET[$value])){
           $option->where($value, $_GET[$value]);
        }
      }
    }
    $gelen_option = $option->get();
    
    foreach($gelen_optionas as $produc){
    $produc_ids[] =  $produc['ProductID']
    }
    burada filitrelere uyan ürünlerin id lerini elde ettik gelen id leri ürünler tablosunda wherein ile sorgutalım

      $urunler = Product:whereIn($id,$produc_ids)->get();
    yazdıklarınızdan anladığım kadar aklımda kurduğum mantık

    filitrelerin id lerini ortak tabloda aratarak gelen ürünlerin id lerinide ürünler tablosundan whereIn ile aratın
    Buna benzer bir yapı kurdum, şuan deniyorum. Kafamı çok karıştırdı. Denemeden sonra sizin anlattığınız şekilde de deneyeceğim. Başarılı olursam buradan yeniden paylaşacağım. Teşekkür ilginiz için



    yidemir adlı üyeden alıntı: mesajı görüntüle
    Tam mantığı kuramadım ama Eloquent ile yaptığında kullanacağın yöntemler şunlar oluyor. Basit bir örnek vereyim, hatalı olabilir ama belki yardımcı olur.

    Product::with('variants', 'options')->when(request('variant') && request('option'), function($query){
      return $query->whereHas('variants', function($query){
        // ..
      });
    });
    with metodu ile ürüne ait varyant ve seçenekleri alıp, when metodu ile eğer querystring de variant veya option varsa whereHas metodu ile (böyle olmayabilir de) işlem yapabilirsin.

    Çok benzemese de koşullu sorguları çözmek için bir yazı yazmıştım belki yardımcı olabilir: https://yilmazdemir.com.tr/eloquent-...sullu-sorgular

    OnurTasci adlı üyeden alıntı: mesajı görüntüle
    ör:filitreden renk seçtiler

    ?variant_tipi=product_option&variant_tipi=product_ option
    - variant_tipi renk olsun diyelim renk in slug benzersiz değer yapalım ona --- filitreden seçilen renk in id sini alalım
    ?renk_slug=kırmızı
    ?renk=1

    olarak get ile sorgu gönderebilirsin
    controller den sorgu yaptığın yerde ise get ile gelen verileri süzdürebilirsin

    $filitre = array('renk',)// filitreden gelen sadece bu değerleri where yapsın diye koruma
    foreach ($filitre as $key => $value) {
      if(isset($option)){
           $option = ProductOption:where($value, $_GET[$value]);
        }else{
        if(isset($_GET[$value])){
           $option->where($value, $_GET[$value]);
        }
      }
    }
    $gelen_option = $option->get();
    
    foreach($gelen_optionas as $produc){
    $produc_ids[] =  $produc['ProductID']
    }
    burada filitrelere uyan ürünlerin id lerini elde ettik gelen id leri ürünler tablosunda wherein ile sorgutalım

      $urunler = Product:whereIn($id,$produc_ids)->get();
    yazdıklarınızdan anladığım kadar aklımda kurduğum mantık

    filitrelerin id lerini ortak tabloda aratarak gelen ürünlerin id lerinide ürünler tablosundan whereIn ile aratın
    Normalde verileri buna benzer bir şekilde alıyorum ama ürün ve categoriler birden fazla olduğu için problem çıkarıyor. Şuan deniyorum.
  • 10-08-2018, 17:18:34
    #5
    Aktimur adlı üyeden alıntı: mesajı görüntüle
    Buna benzer bir yapı kurdum, şuan deniyorum. Kafamı çok karıştırdı. Denemeden sonra sizin anlattığınız şekilde de deneyeceğim. Başarılı olursam buradan yeniden paylaşacağım. Teşekkür ilginiz için Normalde verileri buna benzer bir şekilde alıyorum ama ürün ve categoriler birden fazla olduğu için problem çıkarıyor. Şuan deniyorum.

    ürün ve categoriler birden fazla olduğu için problem çıkarıyor.


    tek sutuna birden fazla veri mi gidiyorsun ben json'a cevirip veritabanına öyle kayıt yaptırıyorum wherede arama yarkende şöyle arıyorum ->where('kolon','"01"');
    kolon içinde olan json veri -> ["01","02","03"] gibi

    veya sorun bu değil de 1 numaralı ürüne ait çoklu kategori olduğunda çekerkenmi zorluk çekiyorsun
  • 10-08-2018, 17:20:09
    #6
    OnurTasci adlı üyeden alıntı: mesajı görüntüle

    ürün ve categoriler birden fazla olduğu için problem çıkarıyor.


    tek sutuna birden fazla veri mi gidiyorsun ben json'a cevirip veritabanına öyle kayıt yaptırıyorum wherede arama yarkende şöyle arıyorum ->where('kolon','"01"');
    kolon içinde olan json veri -> ["01","02","03"] gibi

    veya sorun bu değil de 1 numaralı ürüne ait çoklu kategori olduğunda çekerkenmi zorluk çekiyorsun
    $req = $request->only('dugme-sayisi', 'renk');
    
    $categoryID = $category->CategoryID;
    
    $products = Product::whereHas('productCategory', function ($query) use ($categoryID) {
    $query->where('categories.CategoryID', $categoryID);
    })
    ->whereHas('productOption', function ($query) {
    $query->where('product_option.OptionName', 'Mavi');
    })
    ->get();
    Bu şekilde kullanıyorum. Kategoriye ait ürünler geliyor. Daha sonra manuel olarak arama işlemi yapıyorum. Bu işlemi otomatikleştiremedim.
  • 10-08-2018, 17:31:49
    #7
    Aktimur adlı üyeden alıntı: mesajı görüntüle
    $req = $request->only('dugme-sayisi', 'renk');
    
    $categoryID = $category->CategoryID;
    
    $products = Product::whereHas('productCategory', function ($query) use ($categoryID) {
    $query->where('categories.CategoryID', $categoryID);
    })
    ->whereHas('productOption', function ($query) {
    $query->where('product_option.OptionName', 'Mavi');
    })
    ->get();
    Bu şekilde kullanıyorum. Kategoriye ait ürünler geliyor. Daha sonra manuel olarak arama işlemi yapıyorum. Bu işlemi otomatikleştiremedim.

    $categoryID içinde array dizisimi var öyle ise -> $query->whereIn('categories.CategoryID', array('0','1','3')); yapmanız lazım

    + https://goo.gl/NL5fyX şurayı da inceleyin derim
  • 10-08-2018, 18:16:12
    #8
    OnurTasci adlı üyeden alıntı: mesajı görüntüle
    $categoryID içinde array dizisimi var öyle ise -> $query->whereIn('categories.CategoryID', array('0','1','3')); yapmanız lazım

    + https://goo.gl/NL5fyX şurayı da inceleyin derim
    Hocam ilginiz için çok teşekkür ederim. Sanırım çözdüm whereHas ve WhereIn'i ilk kez kullandım . Şuan istediğim gibi çalışıyor.
  • 10-08-2018, 18:21:08
    #9
    Aktimur adlı üyeden alıntı: mesajı görüntüle
    Hocam ilginiz için çok teşekkür ederim. Sanırım çözdüm whereHas ve WhereIn'i ilk kez kullandım . Şuan istediğim gibi çalışıyor.
    vallahi ben sevindim hocam başarılar