Öncelikle pivot ile kastedilen şeyi açıklayalım.
Bildiğiniz gibi bazı alanlar ile bir tabloyu birden fazla tablo ile ilişkilendirebiliyoruz. Örneğin users ve addresses şeklinde iki tablo olduğunu düşünün. addresses tablosunda kullanıcılara ait adresler tutuluyor. Bu tabloda yer alan user_id alanı ile iki tabloyu birbiri ile ilişkilendiriyoruz. Böylece kullanıcının adresine ulaşabiliyoruz. Bu tip ilişki one-to-many şeklinde geçiyor. Yalnız bu tip ilişkide şöyle bir durum var; bir adres sadece bir kullanıcıya ait olabiliyor. Peki biz kayıtların birden fazla kayıt ile ilişkisi olmasını istersek? Yani bir kaydın birden fazla sahibi olacaksa? Bunun en çok karşınıza çıkan örneği kategori - ürün ilişkisi olabilir. Bir ürünün birden fazla kategorisi olabiliyor. Bu durumda products tablosunda bir category_id alanı tutmak bizim işimize yaramayacaktır. Bu tip sorunu aşmak için kullanılan en yaygın yol ise ilişkiyi ayrı, 3. bir tabloda tutmaktır.
İşte bu ilişkiyi tutan 3. tabloya (diğer iki tablo categories ve products olmuş oluyor) pivot tablo deniyor. . Bu ilişki
many-to-many diye geçiyor ve Laravel'de
belongsToMany() ile sağlanıyor.
Örneğin categories ve products tablosu için categories_has_products isimli bir pivot tablomuz olsun. Kabaca şöyle:
+-------------+-------------+
| category_id | products_id |
+-------------+-------------+
| 5 | 8 |
| 6 | 8 |
| 14 | 8 |
+-------------+-------------+
Ben bu tabloya baktığım zaman id'si 8 olan ürünün id'si 5, 6 ve 14 olan kategorilere ait olduğunu görüyorum. Bu ürünün bir notebook olduğunu düşünün. Bilgisayar, Dizüstü Bilgisayar ve Oyuncu Bilgisayarı kategorilerine aitmiş gibi düşünebilirsiniz.
Laravel açısından;
Bu iki alan model keys olarak geçer. Bu alanlara $product->pivot->category_id şeklinde ulaşabiliyorsunuz. belongsToMany() kullandığınızda ise sadece bu alanlara direk ulaşabilirsiniz. Burada 3. bir alan olsaydı ona ulaşmak için ulaşacağınız alanı withPivot ile belirtmeniz gerekiyor. Laravel'de belongsToMany ile yapılan sorgu size Collection objesi dönderir. Normal şartlarda bu obje içerisinde pivot objesi içerisinde bizim örneğe göre sadece category_id ve product_id barındırır. Biz 3. alanı withPivot ile belirttiğimizde o alan da pivot objesine dahil edilir. Yani:
+-------------+-------------+---------------------+
| category_id | products_id | created_at |
+-------------+-------------+---------------------+
| 5 | 8 | 2019-04-24 12:00:00 |
| 6 | 8 | 2019-04-24 12:00:00 |
| 14 | 8 | 2019-04-24 12:00:00 |
+-------------+-------------+---------------------+
$this->belongsToMany(...)->withPivot('created_at')
$product->pivot->created_at // 2019-04-24 12:00:00