Laravel Meta data birbirine bağlı verileri silmek

Merhaba, proje verilerini yazdırdığım bir veri tablom mevcut.
Oluşturmuş olduğum yapıda eklenilebilir, silinebilir ve ismi değiştirilebilir sütunların olmasını istediğim için meta data olarak tutuyorum. Aynı şekilde tüm satır bilgilerimde meta data olarak tutuluyor. Sütunlarımda verilerin değiştirilmesini ve eklenme işlemlerini yaptım. Silme işleminde hangi sütunu siliyorsam ilgili sütunun tüm satırlarınıda silmek istiyorum. Bunu nasıl yapabilirim?

Sütun tablom: id, user_id, extra_column
Satır tablom: id, user_id, extra_line

Alihan merhaba, foruma hoşgeldin. Ben açıkçası durumu pek anlayamadım. Bu iki tablonun örnek içerikleriyle bir senaryo tanımlaması yapsan daha doğru ve kolay olur sanıyorum. Bu listede bu iki alanın bağlantısı görünmüyor çünkü.

Anladığım kadarıyla bir kullanıcı için normalda tabloda olmayan ek alanlar kullanmak istiyorsun. Ben olsam bunun için ek alanları json tipindeki bir sütunda tutmak için Spatie’nin Laravel Schemaless Attributes paketini kullanırdım: GitHub - spatie/laravel-schemaless-attributes: Add schemaless attributes to Eloquent models

Bu şekilde ak tabloda tutmanda da sakınca yok tabii. Ancak o zaman daha farklı bir yapı izlenebilir, örneğin kullanıcı için ek tutulacak veriler için bir tablo düşün.

Tablo adı: user_extra_fields
Sütunlar:
id (çok kayıt oluşacak öngörün varsa uuid yapmak isteyebilirsin),
user_id (foreign key),
field_name (string),
data (text)

Bir kullanıcının belli tipte bir field için tek bir kaydının olması için [user_id, field_name] için birlikte bir unique index eklersin veritabanında.

Migration içinde şöyle ekleyebilirsin mesela;
$table->unique(['user_id', 'field_name']);

Böylece istediğin kadar ek alan ekleyebilirsin kullanıcı başına.
Sen hangi fieldlar eklenebilsin onu da kontrol etmek istiyorsan, available_user_extra_fields diye başka bir tablo açıp orada da user_extra_fields tablosundaki field_name alanına gelebilecek, senin “sütun adı” dediğin verilerin kaydını tutabilirsin.

Böylece;
available_user_extra_fields tablosuna eklediğin/düzenleyebileceğin string kayıtlardaki field_name alanı, gerektiğinde bir kullanıcı için user_extra_fields tablosundaki field_name alanına yazılıp yanına da içerik data sütununa yazılır.

İleride sen available_user_extra_fields tablosundaki bir field tanımını silersen, aynı field_name değerini paylaşan kayıtları user_extra_fields tablosundan da temizleyebilirsin ve eğer sorduğun soruyu doğru anladıysam böyle bir yapı ihtiyacını çözecektir.

1 Beğeni

Merhaba Uğur hocam, hoşbuldum. Konuya eklemeye unuttuğum bir tablom daha var. Satır ve sütunları çoktan çoğa ilişkilendirmek için bir pivot tablo daha kullanıyorum. Ek olarak bahsettiğiniz Spatie’nin laravel schemaless attributes paketini kullanıyorum. Daha öncesinde siz önermiştiniz. Ben burada satırları ve sütunları ekleyebiliyorum. İstediğim gibi geliyorlar hatta sütun adlarını değiştirebiliyorum. Javascript ile ön yüzde sütun adı düzenleme bölümünde ön yüzdeki inputlardan bir array şekinde verileri aldığım için sınırsız input ekleyip silebiliyorum dolayısıyla istediğim kadar sütun adı ekleyip silebiliyorum. Şimdi burada takıldığım nokta ben örneğin bir sütun adını sildim ve bu veriyi kayıt ettim. 10 sütunum varsa 9 sütunum oldu ama sildiğim sütunun ilgili satır bilgileri silinmedi. Tam olarak yapmaya çalıştığım şey bu aslında. Ben örneğin 3.sütunu sildiğimde o 3.sütuna ait olan tüm satır bilgilerinin de silinmesini istiyorum. Sütun ile birlikte tüm o kolonda yer alan verileri nasıl silebilirim?

Desteğiniz için teşekkür eder, iyi forumlar dilerim.

Alihan gerçekten hiç anlamadım :slight_smile: Zaten metadata için schemaless attributes kullanıyorsan bu fazladan tablolara neden ihtiyacın var anlamıyorum. Sütunları ve bağlı verileri nasıl tutup gerektiğinde nasıl silebileceğini önceki mesajda anlatmıştım. İşine yaramıyor mu? Bahsettiğim veritabanı şemasını da yine anlamadım, belki bir yerde çizip doldursan daha rahat anlaşılır ama pivot tabloyla vs ilişkilerini tutuyorsan birini düşürdüğünde diğerleriyle bağlantısını yakalayıp bağlantılı olanları da silebilmen mümkündür diye düşünüyorum doğal olarak.

Şu anda sorunu çok yüzeysel görüp anlatılandan da bu bir sorun değil ki şöyle şöyle konuştuk ya, onlardan biriyle çözülebilir diye görüyorum doğrusu :slight_smile:

Yanıtın için teşekkür ederim. Bahsetmiş olduğun çözüme tekrar göz atacağım.

İyi forumlar.