Paket kullanmak isterseniz @ak'ın belirttiği paketi inceleyebilirsiniz. Ayrıca spatie'nin diğer paketlerine de bakın derim, Laravel konusunda övdüğüm bir firmadır.
https://github.com/spatie
İstediğiniz şeye gelince, bu polimorfik ilişki olarak geçmektedir.
https://laravel.com/docs/5.6/eloquent-relationships#polymorphic-relations
Öncelikle photos tablonuzda iki adet alana ihtiyacınız olacak. photos için hazırladığınız migrationa şu şekilde ekleyebilirsiniz:
$table->nullableMorphs('photoable');
Bu photoable_type (varchar) ve photoable_id (int) olmak üzere iki alan ve indexlerini oluşturacak. _type olan modeli temsil ediyor, sizin yaptığınızda module_name karşılık gelen, diğer _id olan ise model id'si, sizde relationship_id'ye karşılık gelen.
Daha sonra Photos modelinin polimorfik özelliğini ayarlıyoruz
class Photo extends Model
{
// Burada yöntem adı nullableMorphs ile tanımladığımız isim ile aynı olmalı
public function photoable()
{
return $this->morphTo();
}
}
Hangi model Photo ile polimorfik ilişki kuracaksa onu belirliyoruz
class Page extends Model
{
public function photos()
{
return $this->morphMany(Photo::class, 'photoable');
}
}
class Post extends Model
{
public function photos()
{
return $this->morphMany(Photo::class, 'photoable');
}
}
Şimdi Page ve Post modeline resim ekleyelim:
$page = Page::find(1);
$post = Post::find(5);
$page->photos()->create([
'photo' => 'ornek-resim.jpg'
]);
$post->photos()->create([
'photo' => 'merhaba-dunya.jpg'
]);
photos tablosunda şöyle bir veri oluşmuş olacak:
+----+----------------+--------------+-------------------+
| id | photoable_type | photoable_id | photo |
+----+----------------+--------------+-------------------+
| 1 | App\Page | 1 | ornek-resim.jpg |
| 2 | App\Post | 5 | merhaba-dunya.jpg |
+----+----------------+--------------+-------------------+
Daha sonra bu resimlere ulaşmak istersek
$page = Page::find(1);
// dump($page->photos);
foreach($page->photos as $photo) {
// echo $photo->photo
}
Resimden sahibi olan modele ulaşmak istersek:
$photo = Photo::find(2);
dump($photo->photoable); // id'si 5 olan Post collection dönderecek
Farkettiyseniz photoable_type kısmında model adını App\Page şeklinde tutuyor. Bunu page şeklinde bir alias ile tutmasını isterseniz App\Providers\AppServiceProvider::boot() içerisinde şu şekilde tanımlıyorsunuz:
Relation::morphMap([
'post' => \App\Post::class,
'page' => \App\Page::class,
]);
Dökümanları baştan son bir gözden geçirmenizde fayda var.