Giriş yapmadınız.

#1 27.12.2018 17:39:30

emre64ince
Üye
Kayıtlı: 27.12.2018
Mesajlar: 1

Kayıt silme işlemi

Kaydı silme durumunda o kaydın diğer tablolarda bir foreign keyi sütunu varsa silmeyi nasıl engelleyebilirim?

Çevrimdışı

#2 27.12.2018 19:17:32

evrend
Üye
Yer: DÜZCE
Kayıtlı: 26.05.2014
Mesajlar: 377
Website

Yanıt: Kayıt silme işlemi

Bir veriye foreign key ile bağlı başka veri varsa zaten varsayılan durumda mysql hata(Integrity constraint violation: 1451 diye başlar hata) fırlatıyor. Default durumda mysql'in fırlattığı hatayı aşağıdaki gibi yakalayarak kullanıcılarınızı bilgilendirebilirsiniz.

if (strpos($exception->getMessage(), 'Integrity constraint violation: 1451')) {
    $message = "Bu kayıt başka kayıtlarla bağlantılı olduğundan, silinemez!";
    $code = 500;
}

Eğer foreign key eklerken " ->onDelete('cascade')" komutunu eklerseniz bağlı kayıtlarda otomatik olarak silinir.


Unutmayın, HERKOD aynı değildir.
Fiyat/Performans Cloud için: Digital Ocean.
Ayda 2,5$'a 512Mb ram, 1Core CPU Cloud için: Vultr.

Çevrimdışı

#3 28.12.2018 04:00:27

elementaryos
Üye
Kayıtlı: 20.04.2017
Mesajlar: 185

Yanıt: Kayıt silme işlemi

İstesenizde silemeyeceksiniz ki. Ayrıca zaten kendisi otomatik silmez.

Çevrimdışı

#4 28.12.2018 09:16:33

coder2
Üye
Yer: Antalya
Kayıtlı: 09.12.2018
Mesajlar: 53

Yanıt: Kayıt silme işlemi

onDelete(“cascade”) vermediyseniz silmez zaten.

Bunun yerine trigger ile kaydın silinmesi durumunda ilgili tablodaki verilerin ilgili sütunlarının güncellenmesi işlemini yapabilirsiniz.

Çevrimdışı

#5 28.12.2018 11:48:29

mgsmus
Moderatör
Yer: Mersin
Kayıtlı: 17.08.2013
Mesajlar: 1,702
Website

Yanıt: Kayıt silme işlemi

Ben silme işleminden önce bağlı kayıt olup olmadığını kontrol ettiriyorum. Bağlı kayıt varsa her zaman olmasa da silinmesine izin vermiyorum, önce alakalı kayıtların silinmesi gerektiğine dair bir uyarı mesajı gösteriyorum.

$user= User::findOrFail($id);

if($user->products()->count()) {
    return response()->json([
        'message' => 'Kullanıcıyı silebilmek için önce kullanıcıya ait ürünleri silmeniz gerekiyor'
    ]);
}

$user->delete();

gibi

Çevrimdışı

#6 28.12.2018 14:07:57

sineld
Yönetici
Yer: Bursa
Kayıtlı: 26.12.2012
Mesajlar: 1,490
Website

Yanıt: Kayıt silme işlemi

Bu da benim benzer ilişkili kayıt denetleme mekanizmam:

    public function destroy($id)
    {
        $exists = DB::table('user_user_type')
            ->where('type_id', $id)
            ->count();

        if ($exists) {
            if (request()->ajax()) {
                $this->failedReason = trans('messages.existsOnRelation');
            } else {
                flash('existsOnRelation');
            }
        } else {
            if (!request()->ajax()) {
                flash('userTypeDeleted');
            }

            $userType = UserType::find($id);

            return $userType->forceDelete();
        }
    }

İlişkili kayıt var olduğu sürece silme işlemi gerçekleşmez ve önce ilişkili kayıtların silinmesi gerektiğini bildirir.

Çevrimdışı

#7 29.12.2018 10:28:09

deathisonitsway
Üye
Kayıtlı: 01.02.2016
Mesajlar: 476

Yanıt: Kayıt silme işlemi

mgsmus yazdı:

Ben silme işleminden önce bağlı kayıt olup olmadığını kontrol ettiriyorum. Bağlı kayıt varsa her zaman olmasa da silinmesine izin vermiyorum, önce alakalı kayıtların silinmesi gerektiğine dair bir uyarı mesajı gösteriyorum.

$user= User::findOrFail($id);

if($user->products()->count()) {
    return response()->json([
        'message' => 'Kullanıcıyı silebilmek için önce kullanıcıya ait ürünleri silmeniz gerekiyor'
    ]);
}

$user->delete();

gibi


hocam böyle spesific message vermek için olabilirde.5-6 table olunca can sıkar bu ifler.bir event gibi modelde calıstırılamıyor mu bunlar.delete gelince bunlara baksın.
öbür türlü foreign key on_delete(cascade) yoksa zaten silmeyecek ama spesifik mesaj icin @evrend in yolu izlenebilir sanki.

ek olarak hard delete yapmak kaldı mı ki smile en iyi yol soft delete diye dusunuyorum.

Son düzenleyen deathisonitsway (29.12.2018 10:29:45)


Laravel does not save you. Php knowledge only save you. Do not become a Laravel programmer, just the opposite,become php developer.

Çevrimdışı

#8 29.12.2018 14:13:23

sineld
Yönetici
Yer: Bursa
Kayıtlı: 26.12.2012
Mesajlar: 1,490
Website

Yanıt: Kayıt silme işlemi

ek olarak hard delete yapmak kaldı mı ki smile en iyi yol soft delete diye dusunuyorum.

Normal şartlarda hep delete deyip geçeceksiniz, burada farklı bir mekanizma kullandığım için harddelete ediyorum.

bir event gibi modelde calıstırılamıyor mu bunlar.delete gelince bunlara baksın.

Model event kısmına bakacaksınız:
https://laravel.com/docs/5.7/eloquent#events

Çevrimdışı

#9 29.12.2018 18:56:44

mgsmus
Moderatör
Yer: Mersin
Kayıtlı: 17.08.2013
Mesajlar: 1,702
Website

Yanıt: Kayıt silme işlemi

deathisonitsway yazdı:
mgsmus yazdı:

Ben silme işleminden önce bağlı kayıt olup olmadığını kontrol ettiriyorum. Bağlı kayıt varsa her zaman olmasa da silinmesine izin vermiyorum, önce alakalı kayıtların silinmesi gerektiğine dair bir uyarı mesajı gösteriyorum.

$user= User::findOrFail($id);

if($user->products()->count()) {
    return response()->json([
        'message' => 'Kullanıcıyı silebilmek için önce kullanıcıya ait ürünleri silmeniz gerekiyor'
    ]);
}

$user->delete();

gibi


hocam böyle spesific message vermek için olabilirde.5-6 table olunca can sıkar bu ifler.bir event gibi modelde calıstırılamıyor mu bunlar.delete gelince bunlara baksın.
öbür türlü foreign key on_delete(cascade) yoksa zaten silmeyecek ama spesifik mesaj icin @evrend in yolu izlenebilir sanki.

ek olarak hard delete yapmak kaldı mı ki smile en iyi yol soft delete diye dusunuyorum.

foreign key ile silme işlemi SQL düzeyinde olan bir işlem olduğu için uygulama yapısı tarafında artık bırakma ihtimali yüksek. Kontrollü bir silme yöntemi değil. Pivot tablo kayıtlarının silinmesinde kullanışlı belki ama bazen bir model başka bir modele, o da başka bir modele bağlı oluyor, o son modelin de sistemde kayıtlı fiziksel dosyaları oluyor. Bu gibi durumlarda kontrollü silme işlemi yapmanız gerekiyor. Ben yine de foreign key kullanıyorum ama performans gerekçesiyle, sonuçta o da bir index oluşturuyor. Özellikle muhasebe programları gibi programlarda silmeye sondan başlanır, ta ki ana kayıt bağımsız oluncaya kadar, en son ana kayıt silinir.

Benim verdiğim örnek Model event ile yapılabilir elbette ama ben Model'e Response karıştırmak istemem, biri  database katmanına ait, diğeri HTTP katmanına ait. Bunu daha çok her ikisini de kullanan bir Service ile halletmeyi düşünürdüm sanırım.

Soft delete olayı veritabanı düzeyinde unique kayıtlar bulundurmadığınız taktirde iyi bir yöntem olabilir.

Daha önce de dediğim gibi bu iş denge işi, neyi kullanıp kullanmayacağınızı proje belirleyecek.

Çevrimdışı

Forum alt kısmı