Bilindiği üzere Laravel’de modeller arasında kurulabilen 4 çeşit ilişki vardır.

1. One To One (Birden Bire)
2. One To Many (Birden çoğa)
3. Many To One (Çoktan Bire)
4. Many To Many (Çoktan Çoğa)

Diğer ilişki türlerini tahmin az çok edebiliyorsunuzdur, bizim burada duracağımız konu Many to Many özelinde attach, detach ve sync konusu olacak.

Öncelikle şunu açıklayalım : Many to Many ilişki nedir ?
Bir modeldeki bir çok kayıtın, diğer modeldeki bir çok kayıta ilişkisel anlamda bağlı olmasına Many To Many ilişki denir.

Evet, bunu anlamak için en iyisi bir örnekle açıklamak.
authors tablonuz olduğunu düşünün. Bu tabloda yazarlar bulunuyor.
books diye bir tablonuz daha olduğunu düşünün. Bu tabloda da kitaplar bulunuyor.
Bir yazar birden çok kitap yazmış olabilir.
Bir kitabın da birden çok yazarı olabilir.
İşte bu tür ilişkiler Many to Many ilişki olarak tanımlanır.

Many to Many ilişkiyi tanımlamak için ana tablolar olan authors ve books tablolarından ayrı olarak bir tane daha tabloya ihtiyacımız olur : author_book
Bu tablonun author_id ve book_id isimli 2 tane alana sahip olması yeterli.

İşte Book modelimiz.
Gördüğünüz gibi içerisinde authors isminde bir metod var ve ilişki belongsToMany olarak kurulmuş.

namespace App;
use Illuminate\Database\Eloquent\Model;
class Book extends Model
{

public function authors()
{
return $this->belongsToMany('App\Author');
}
}

İşte bu da Author modelimiz.
Gördüğünüz gibi içerisinde books isminde bir metod var ve ilişki belongsToMany olarak kurulmuş.

namespace App;
use Illuminate\Database\Eloquent\Model;

class Author extends Model

public function books()
{
return $this->belongsToMany('App\Book');
}
}

2 tablo arasında ilişkiyi kurduğumuza göre bir kitabın yazarlarını şu şekilde kolayca çekebiliriz.

$book = App\Book::find(1);
foreach ($book->authors as $author) {
dd($author->name);
}

Gelelim esas konumuza 🙂
Laravel bu ilişkileri birbirine bağlamak, koparmak ya da senkronize etmek için 3 yardımcı sunuyor:
attach, detach ve sync

Önce attach’a bakalım

$authorId=2;
$book = App\Book::find(1);
$book->authors()->attach($authorId);

Gördüğünüz gibi 1 nolu kitaba, 2 nolu yazarı atamış (attach etmiş) olduk.

Şimdi de detach

Bir kitaba atanmış bir yazarın ilişkini koparabilir yani o yazarı ilgili kitabın yazarlığından çıkartabiliriz.

$authorId=5;
$book->authors()->detach($authorId);

Yukarıdaki kod sayesinde 5 nolu yazarı, ilgili kitaptan çıkartmış (detach etmiş), ilişkisini koparmış olduk.

Eğer bir kitaptan bir kaç yazarın ilişkisini koparmak isterseniz detach metoduna parametre olarak bir kaç id verebilirsiniz.

$book->authors()->detach(1,5,7,11) gibi.

Ayrıca bir kitaptaki tüm yazarların ilişkisini koparmak istiyorsanız bu defa $book->authors()->detach(); şeklinde detach’a parametre vermeden bunu gerçekleştirebilirsiniz.

Ve son olarak sync

sync metodu ise verilen ilişkiler dışındaki ilişkileri koparır ve verilen ilişkilerin kalmasını sağlar.

Örneğin $book->authors()->sync([5, 10, 15]); şeklinde bir kod ile 5, 10, 15 nolu id’ler dışındakiler silinir ve sadece 5, 10, 15 nolu id’lerin ilişkisi kalır.