Laravel Türkiye Discord Kanalı Forumda kod paylaşılırken dikkat edilmesi gerekenler!Birlikte proje geliştirmek ister misiniz?
Selamlar pivot table da bir sorun yaşıyorum . Model kullanmadım bu projede .

3 Tane modelim var . 1 :Users tablosu , promosyon_kodlari 3 . tablo bu ikisinin birleştiği : kullanilan_promosyon_kodlari içinde user_id ve promosyon_kod_id var.

USER MODELİNDE

 public function prokod()
 {
 return $this->belongsToMany('App\prokod','kullanilan_promosyon_kodlari','user_id','promosyon_kod_id');
 }


pormosyon kodları modelinde

 public function user()
 {
 return $this->belongsToMany('App\User','kullanilan_promosyon_kodlari','promosyon_kod_id','user_id');
 }

böyle bir yapım var ama tabloyu el ile oluşturduğum için izlediğim videolarda pivot tablodaki alanların ikisine primary veriyor . Ben veremiyorum . İzin vermiyor.

1- Primary keyi illa vermek zorundamıyız ? Not : Şuan verileri çekebiliyorum sıkıntım yok . Sadece doğruyu öğrenmeye çalışıyorum.


2-

Contollerda :
 $prokod = prokod::all();

 return view('admin.pages.kullanilanpromosyonkodlari',compact('prokod'));
blade tarafında

 @foreach($prokod as $prokods)
 @foreach($prokods->user as $user)
 <tr>
 <td>{{ $user->name }}</td>
 <td>{{ $prokods->kod }}</td>
 <td>{{ $prokods->fiyat }} TL</td>
 </tr>
 @endforeach
 @endforeach


Bu işlemle verileri çektim fakat bir kod kaç kere kullanılmış bunun için pivot tabloya nasıl ulaşabilirim acaba ?
Pivot tabloda user_id ve promosyon_kod_id alanlarının birlikte PRIMARY KEY olması composite key (çoklu sütun indeksi) şeklinde isimlendirilir. Kayıtlar bu şekilde indekslendiği için sorgular çok daha hızlı çalışacaktır, özellikle kayıt sayısı arttıkça aradaki fark hissedilir. Şu an sizde indeks yoksa sorgu yaptığınızda veritabanı tüm tabloyu baştan sona tarıyor. Elbette birkaç bin kayıt olan tablolarda pek bir yavaşlama hissetmezsiniz fakat birkaç milyon kayıt olan tablolarda indeks/composite key kullanılmasının sorguyu 25 saniyeden 200 ms kadar düşürdüğünü zamanında tecrübe ettim.

İndeks konusunun özüne gelince (doğruyu öğrenmeniz adına, umarım ben de doğru biliyorumdur);
Tabloda indekslenmiş alan olması sorgu sırasında o indeksin kullanıldığı anlamına gelmez. Rastgele, örneklerde var diye şuursuzca indeks vermek yanlış yapmanıza ya da farkında olmadan yavaş sorgular almanıza sebep olabilir. Kısaca anlatmaya çalışayım, zaten sabah olmak üzere, bugün zorlu bir mesai olacak

(✓) id PRIMARY KEY olmak üzere; SELECT * FROM users WHERE id = 1;
Burada indeks kullanılır. Yıldırım hızıyla sonucu alırsınız.

(x) id PRIMARY KEY olmak üzere; SELECT * FROM users WHERE name = "Kevin-Mitnick";
name alanı indeks değilse burada indeks kullanılmaz. Tüm tablo taranır.

(✓) (user_id, promosyon_kod_id) composite key olmak üzere; SELECT * FROM kullanilan_promosyon_kodlari WHERE user_id = 2;
Burada indeks kullanılır.

(✓) (user_id, promosyon_kod_id) composite key olmak üzere; SELECT * FROM kullanilan_promosyon_kodlari WHERE user_id = 2 AND promosyon_kod_id=5;
Burada indeks kullanılır.

(x) (user_id, promosyon_kod_id) composite key olmak üzere; SELECT * FROM kullanilan_promosyon_kodlari WHERE promosyon_kod_id=5;
Her ne kadar promosyon_kod_id composite key'in içinde olsa da burada indeks kullanılmaz. Bu kuraldır, soldan itibaren alanların sırayla sorguda kullanılması lazım. Ya user_id ya da user_id AND promosyon_kod_id olacak

(x) (user_id, promosyon_kod_id) composite key olmak üzere; SELECT * FROM kullanilan_promosyon_kodlari WHERE promosyon_kod_id=5 AND user_id = 2;
Her ne kadar promosyon_kod_id ve user_id composite key'in içinde olsa da burada indeks kullanılmaz. Bu kuraldır, soldan itibaren alanların sırayla sorguda kullanılması lazım. composite key indeksi ayrıca dahil edilen alanlarına sırasına göre oluşuyor.

Bu durumda eğer siz WHERE promosyon_kod_id=5 ya da WHERE promosyon_kod_id=5 AND user_id = 2 gibi tersten de sorgu yapacaksanız ayrıca ->index(['promosyon_kod_id', 'user_id']); şeklinde bir indeks oluşturmanız gerekiyor. (Eğer PRIMARY olan ->primary(['user_id', 'promosyon_kod_id']); şeklindeyse tabi)

SELECT * FROM kullanilan_promosyon_kodlari WHERE user_id = 2 AND promosyon_kod_id=5
Bu şekilde bir sorgu, (user_id, promosyon_kod_id) composite key olmak üzere, indeksi kullanır ve tabloyu taramaz, direk kaydı getirir.

Umarım anlatabilmişimdir.

Pivot alanlara ulaşmak için ise;
$prokods->pivot->user_id;
Bunlar ilişki kurulan model alanları oldukları için pivot objesine otomatik eklenir ama bunların dışında ekstra alan varsa aşağıdaki gibi pivot objesine dahil edebilirsiniz:
return $this->belongsToMany(...)->withPivot('ekstra_alan_adi', 'diger_alan');
@mgsmus hocam valla üşenmeyip yazmışsınız çok teşekkür ediyorum . Şimdi ben mysql tarafında gidip gerçi şuan birşey farketmiyor 10 kayıt var user_id ile promosyon_kod_id yi indexe çevirmem gerekiyor öyle anladım ve buda bana yetiyor . Tekrardan teşekkür ediyorum.
$prokods->pivot->user_id;
bunun içinde ayrı teşekkürlerimi sunuyorum.
Evet, şu şekilde kısaca:
$table->primary(['user_id', 'promosyon_kod_id']);
$table->index(['promosyon_kod_id', 'user_id']);