DEV Community

Barış Bideratan
Barış Bideratan

Posted on

Laravel’de İlişkiler: `belongsToMany` ve `hasMany` Arasındaki Farklar

Laravel, Eloquent ORM (Object-Relational Mapping) yapısı ile veritabanı işlemlerini oldukça kolaylaştırır. Bu yazıda, belongsToMany ve hasMany ilişkileri arasındaki farkları ele alacağız. Bu iki ilişki türünü anlamak, veritabanı modelleriniz arasında doğru bağlantıları kurmak için kritik öneme sahiptir.

hasMany İlişkisi

hasMany ilişkisi, bir modelin diğer birçok modele sahip olduğunu belirtir. Bu ilişki genellikle "bir-çok" (one-to-many) ilişkisidir. Örneğin, bir kullanıcının (User) birden fazla gönderisi (Post) olabilir.

Kullanıcı (User) ve Gönderiler (Posts) Örneği

Bir Kullanıcı modelinin birden fazla Gönderi modeli olabilir. Bu durumda, Kullanıcı modelinde hasMany fonksiyonunu tanımlarız.

// User modelinde
public function posts()
{
    return $this->hasMany(Post::class);
}
Enter fullscreen mode Exit fullscreen mode

Burada, posts metodu, bu kullanıcının sahip olduğu gönderileri alır. Post modelinde ise, her gönderinin bir kullanıcıya ait olduğunu belirtiriz.

// Post modelinde
public function user()
{
    return $this->belongsTo(User::class);
}
Enter fullscreen mode Exit fullscreen mode

Bu şekilde, her gönderinin bir kullanıcıya ait olduğunu belirten user metodunu tanımlamış oluruz. Bu ilişki, veritabanında genellikle şu şekilde temsil edilir: posts tablosunda bir user_id sütunu bulunur ve bu sütun, gönderinin hangi kullanıcıya ait olduğunu belirtir.

Özet:
  • hasMany: Bir modelin diğer birçok modele sahip olduğunu belirtir.
  • belongsTo: Bir modelin, belirli bir modele ait olduğunu belirtir.

belongsToMany İlişkisi

belongsToMany ilişkisi, birçok modelin diğer birçok modele ait olduğunu belirtir. Bu ilişki genellikle "çok-çok" (many-to-many) ilişkisidir. Bu tür ilişkilerde, her iki tablo da birbirine birçok kez bağlı olabilir ve bu bağlantıları temsil eden bir ara tablo (pivot table) kullanılır.

Öğrenciler (Students) ve Dersler (Courses) Örneği

Bir öğrenci birçok derse kaydolabilir ve bir ders birçok öğrenci tarafından alınabilir. Bu durumda, her iki modelde de belongsToMany fonksiyonunu tanımlarız.

// Student modelinde
public function courses()
{
    return $this->belongsToMany(Course::class);
}
Enter fullscreen mode Exit fullscreen mode

Burada, courses metodu, öğrencinin kayıtlı olduğu dersleri alır. Benzer şekilde, Course modelinde, bu dersin kayıtlı olduğu öğrencileri belirtiriz.

// Course modelinde
public function students()
{
    return $this->belongsToMany(Student::class);
}
Enter fullscreen mode Exit fullscreen mode

Bu tür ilişkilerde, ara tablo (pivot table) kullanılır. Bu tablo, her iki modelin ID’lerini içeren iki sütuna sahip olur. Örneğin, course_student adında bir ara tablo olabilir ve bu tablo student_id ve course_id sütunlarını içerir.

Özet:
  • belongsToMany: Birçok modelin diğer birçok modele ait olduğunu belirtir.
  • Ara tablo (pivot table) kullanılır.

Örnek Projeler ve Kullanım Senaryoları

Blog Uygulaması: User ve Post İlişkisi

Bir blog uygulaması düşünelim. Her kullanıcının birçok gönderisi olabilir. Bu ilişkiyi hasMany ve belongsTo ilişkileri ile kurabiliriz.

User Modeli:

class User extends Model
{
    public function posts()
    {
        return $this->hasMany(Post::class);
    }
}
Enter fullscreen mode Exit fullscreen mode

Post Modeli:

class Post extends Model
{
    public function user()
    {
        return $this->belongsTo(User::class);
    }
}
Enter fullscreen mode Exit fullscreen mode

Eğitim Yönetim Sistemi: Student ve Course İlişkisi

Bir eğitim yönetim sistemi düşünelim. Öğrenciler birçok derse kayıt olabilir ve dersler birçok öğrenci tarafından alınabilir. Bu ilişkiyi belongsToMany ile kurabiliriz.

Student Modeli:

class Student extends Model
{
    public function courses()
    {
        return $this->belongsToMany(Course::class);
    }
}
Enter fullscreen mode Exit fullscreen mode

Course Modeli:

class Course extends Model
{
    public function students()
    {
        return $this->belongsToMany(Student::class);
    }
}
Enter fullscreen mode Exit fullscreen mode

Bu ilişkileri tanımladıktan sonra, veritabanında course_student adında bir ara tablo oluştururuz. Bu tablo, student_id ve course_id sütunlarını içerir.

Sonuç

Laravel’de ilişkileri anlamak, veritabanı modelleri arasında doğru bağlantıları kurabilmek için oldukça önemlidir. hasMany ilişkisi, bir modelin diğer birçok modele sahip olduğu durumlarda kullanılırken, belongsToMany ilişkisi, birçok modelin diğer birçok modele ait olduğu durumlarda kullanılır.

Top comments (0)