Laravel Türkiye Discord Kanalı Forumda kod paylaşılırken dikkat edilmesi gerekenler!Birlikte proje geliştirmek ister misiniz?
  • Yardım
  • E-ticaret Ürün Detay Sayfasında Ürün Özellikleri Gösterimi Sorunu

Merhaba, Konuyu yanlış bir yerde açmış olabilirim. Eğer öyle bir şey olmuşsa affola. Laravel ile ilk defa proje geliştiriyorum. Bir şeyi öğrenmenin en iyi yolu, öğreneceğiniz işi direk uygulama yaparak öğrenmek. Bende bu zorlu sürece e-ticaret sitesi yapmak ile başladım. (Öğrenmek için zoru severim). Vaktinizi fazla almadan soruma geçmek istiyorum. Burada bulunan üstatlardan öğreneceğim çok şey var. Şimdiden teşekkür ederim.

products
id | Name
1 | Kazak
2 | Mont

variants
id | product_id | name
1 | 1 | Kırmızı S Beden Kazak
2 | 1 | Kırmızı M Beden Kazak
3 | 1 | Mavi S Beden Kazak
4 | 2 | Mavi M Beden Mont

attributes
id | Name
1 | Renk
2 | Beden

attribute_values
id | attribute_id | name
1 | 1 | Kırmızı
2 | 1 | Mavi
3 | 2 | S
4 | 2 | M

product_attributes (pivot)
product_id | variant_id | attribute_id | value_id
1 | 1 | 1 | 1
1 | 1 | 2 | 3
1 | 2 | 1 | 1
1 | 2 | 2 | 4
1 | 3 | 1 | 2
1 | 3 | 2 | 3
2 | 4 | 1 | 2
2 | 4 | 2 | 4

Tablo yapılarım bu şekilde. Ürünlerimi listelerken renklerine göre listeliyorum. Yani kaç çeşit renk tanımlanmışsa o kadar varyantlı ürünüm gözüküyor. Ürünleri varyant_id ye göre ürün detay sayfasına gönderiyorum. Ürün özelliklerini gösterirken product_attributes tablosundaki renk ve beden altına tüm value_id name verileri geliyor.

#product Model
public function variants()
{
return $this->hasMany(VariantsModel::class, 'product_id');
}

#variant Model
public function product()
{
return $this->belongsTo(ProductModel::class, 'product_id');
}

public function attributes()
{
return $this->belongsToMany(AttributesModel::class, 'product_attributes', 'variant_id', 'attribute_id');
}

#Attribute Model
public function attributeValues()
{
return $this->belongsToMany(AttributeValuesModel::class, 'product_attributes', 'attribute_id', 'value_id');
}

#variant Controller
$variant = VariantsModel::with('attributes.attributeValues')->findOrFail($id);

Saygılarımla

  • mgsmus bunu yanıtladı.
  • SerkanMUTU Şöyle deneyebilirsiniz:

    $variant = VariantsModel::with([
            'attributes.attributeValues' => function($query) use ($id) {
                $query->wherePivot('variant_id', $id)
            }
        ])
        ->findOrFail($id);

    Tablo altında belirtmiştim üstat ama. gözden kaçtı sanırım...
    Tablo yapılarım bu şekilde. Ürünlerimi listelerken renklerine göre listeliyorum. Yani kaç çeşit renk tanımlanmışsa o kadar varyantlı ürünüm gözüküyor. Ürünleri varyant_id ye göre ürün detay sayfasına gönderiyorum. Ürün özelliklerini gösterirken product_attributes tablosundaki renk ve beden altına tüm value_id name verileri geliyor.

    mgsmus
    Tablo altında belirtmiştim üstat ama. gözden kaçtı sanırım…
    Tablo yapılarım bu şekilde. Ürünlerimi listelerken renklerine göre listeliyorum. Yani kaç çeşit renk tanımlanmışsa o kadar varyantlı ürünüm gözüküyor. Ürünleri varyant_id ye göre ürün detay sayfasına gönderiyorum. Ürün özelliklerini gösterirken product_attributes tablosundaki renk ve beden altına tüm value_id name verileri geliyor.

      #product_attributes pivot Modelim

      class ProductAttributesModel  extends Pivot
      {
          protected $table = "product_attributes";
          public $timestamps = false;
          
          public function product()
          {
              return $this->belongsTo(ProductModel::class);
          }
      
          public function attribute()
          {
              return $this->belongsTo(AttributesModel::class);
          }
      
          public function attributeValue()
          {
              return $this->belongsTo(AttributeValuesModel::class);
          }
      
          public function variant()
          {
              return $this->belongsTo(VariantsModel::class);
          }
      }

        SerkanMUTU

        SerkanMUTU Ürün özelliklerini gösterirken product_attributes tablosundaki renk ve beden altına tüm value_id name verileri geliyor.

        Hatalı olduğunu düşündüğünüz yer burası mı? Gelmemesi mi gerekiyor? Ne gelmesini bekliyorsunuz?

          mgsmus
          sadece o ürüne ait olanların gelmesi gerekirken ekli olan tüm ürünlerin attribute value leri geliyor. 2 numaralı urun detayı için Renk : Mavi ve Beden : M gelmesi gereken. Fakat renk kısmında kırmızı ve mavi beden kırmızıda S ve M beden olarak geliyor. farklı bir ürün daha eklediğimde Renk: Yeşil Beden: XL buson eklenen özelliklerde diğer ürüne ekleniyor.

            SerkanMUTU Şöyle deneyebilirsiniz:

            $variant = VariantsModel::with([
                    'attributes.attributeValues' => function($query) use ($id) {
                        $query->wherePivot('variant_id', $id)
                    }
                ])
                ->findOrFail($id);

              mgsmus
              Teşekkür ederim üstat emeğine sağlık.

              mgsmus Bu sorguya gore with içerisinde groupby kullanamıyormuyuz. şöyleki $query->wherePivot('variant_id', $id)->groupBy('value_id') gibi. iki defa kırmızı yada iki defa S beden gelmemesi için. with içerisinde groupby kullanamıyorsam model içinde mi groupby yapmam lazım. teşekkür ederim.

                • mgsmus

                  Seviye 1382
                • Düzenlendi

                SerkanMUTU Elde ettiğiniz sonuç üzerinde uygulayabilirsiniz:

                $variant->attributes
                    ->transform(function($attribute) {
                        $attribute->attributeValues = $attribute->attributeValues
                            ->groupBy('value_id');
                
                        return $attribute;
                    });

                Birçok yolu var. Bunları yapmadan SQL ile de yapılabilir, söz vermiyorum ama boş zamanımda bir şeyler hazırlarım belki.

                  mgsmus teşekkür ederim üstat eline emeğine sağlık.

                  4 gün sonra

                  mgsmus Tekrar merhaba üstat. Öğrenmeye başladığım laravel yolculuğunda yeni yeni birçok şey öğrendim. Bu öğrenme sürecinde laravel.gen.tr deki konuları araştırıyorum. Bunun yanında laravel dökümanları da cok cok işime yarıyor. Ayrıca github repolarınızıda inceledim. Sınırsız kategori olayını hallettim, kategoriye gore urunlerimi getirebiliyorum, ürünün birden fazla fotografı varsa bunları ayrı ayrı getirebiliyorum. Üyelik sistemimi ayarladım. vs vs.

                  yapamadıklarım
                  Ürün detay sayfamda ürüne ait beden ve renk seçeneklerini sayende düzgün bir şekilde getiriyorum. fakat yapamadığım iki şey var.
                  Birincisi sıkıntım
                  Ürün detay sayfasındaki ilgili ürünün beden ve renk seçeneklerindeki değerlerin seçili gelmesi. ( Ürünüm Small Kırmızı ise beden ve renk seçeneklerindeki S ve Kırmızı seçili gelsin istiyorum.)
                  İkinci Sıkıntım
                  Beden ve renk özelliğindeki değerlere stok bilgisi aktarmam gerekiyor. ürün detay sayfasına gelindiğinde varsayıyorum (small kırmızı ürün) S ve Kırmızı seçili iken Medium seçeneğinin stok sıfır ise bunun tıklanılabilir olmasını engellemek istiyorum.

                  stok tablom
                  product_stock
                  shop_id | product_id | variant_id | stock | price

                  Ürün detay sayfasındaki ürün özellikleri döngüm

                  @php
                          $data = [];
                      foreach ($options as $attribute){
                              $data[$attribute->name] = [$attribute->attributeValues->pluck('name')];
                      }
                  
                      foreach ($data as $key => $value){
                          <p class='fw-bold m-0 my-2'>{{ $key }}</p>
                          foreach ($value as $val){
                              <span class="me-2 border p-1 px-2 rounded">
                                  {{ $val }}
                              </span>
                          }
                      }
                  @endphp

                  Bu konu dışında fikrini almak istedigim bir konu var. cevaplamak isterseniz fikriniz benim için önemli.
                  ürün indirimlerim için indirim ve indirim detay tabloları olusturup buradan mı indirim yapmalıyım. yoksa genel olarak komple kampanya yönetimi gerekli tablolarımı olusturup bu yapı ilemi indirim tanımlamalıyım.
                  Teşekkürler

                    SerkanMUTU Ürün detay kısmında ürüne, varyantlarına ve özelliklerine sahipsiniz. Bu istediklerinizi yapabiliyor olmanız lazım:

                    @foreach($özellikler as $özellik)
                        {{ $ozellik->name }} 
                        @if($varyant->ozellikler->contains($ozellik))
                            Seçili
                        @endif
                    @endforeach

                    Kampanya konusunda bir şey söylemek zor. Daha önce tam kapsamlı bir kampanya sistemi hazırlamaya çalıştım, pek kolay geçtiğini söyleyemem.

                    SerkanMUTU İkinci Sıkıntım
                    Beden ve renk özelliğindeki değerlere stok bilgisi aktarmam gerekiyor. ürün detay sayfasına gelindiğinde varsayıyorum (small kırmızı ürün) S ve Kırmızı seçili iken stok değerlerini almam gerekiyor. stok degerine gore müşteriye tıklanabilir yada tıklanamz yapacagım
                    cok vaktinizi alıyorum ustat farkındayım ama bunuda yanıtlayabilirseniz cok sevinirim.

                      Controller'dan gelen veriyi direk döngüye sokmuyorum. yeni bir array olusturup bu yeni arrayi donguye sokuyorum. bu durumda da tum seçeneklerim işaretli geliyor. Help me üstat. 🙂

                      @php
                              $data = [];
                          foreach ($attributes $attribute){
                                  $data[$attribute->name] = [$attribute->attributeValues->pluck('name')];
                          }
                      
                          foreach ($data as $key => $value){
                              <p class='fw-bold m-0 my-2'>{{ $key }}</p> // Renk ve Beden olarak geliyor
                              foreach ($value as $val){
                                  <span class="me-2 border p-1 px-2 rounded">
                                      {{ $val }} // Renk Altına : Kırmızı - Mavi Beden Altına : S M XL olarak geliyor
                                  </span>
                              }
                          }
                      @endphp

                        SerkanMUTU Ürün özellikleri var bir de ürünün varyantına bağlı özellikler var. Ürün özelliklerini foreach içerisinde dönerken içeride ürünün varyantına bağlı özellikler ile karşılaştıracaksınız. Eğer eşleşme varsa seçili yapacaksınız. Üstte size örnekle anlatmaya çalıştım.

                          mgsmus Sorunu çözdüm üstat çok teşekkür ederim. Ellerine sağlık