askorbik Recursive ilişki kurmaya çalıştığınız için daha pratik yolu yok. Daha pratik yöntemler için path enumeration gibi teknikler kullanılabilir ama onlarda da kayıt girme sırasında iş yükü oluşur. Bu haliyle iyi, sadece sorguları oluştururken eager loading ile kayıtları çekmeye özen gösterin. Ayrıca sorgularda sınıf isimleri gelen yerlere $this kullanmayın, mevcut yüklenmiş bir objeyi kullanmak beklenmeyen sonuçlara sebep olabilir. Kabaca şöyle bir ilişkiler dizisi kurulabilir.
public function parent(): BelongsTo
{
return $this->belongsTo(Category::class, 'parent_id')
->withDefault();
}
public function categories(): HasMany
{
return $this->hasMany(Category::class, 'parent_id');
}
public function children(): HasMany
{
return $this->hasMany(Category::class, 'parent_id')
->with('categories');
}
$categories = Category::whereNull('parent_id')
->with([
'parent',
'children'
])
->get();
Bu tür yöntemlere ihtiyacınız yoksa parent_id yanına bir de parent_name alanı açarsınız, oluşturma ve güncelleme işlemlerinde o alanı üst kategori alanıyla doldurursunuz, daha pratik yolu bu olur sanırım.