Giriş yapmadınız.

#1 02.07.2019 13:14:32

neri
Üye
Kayıtlı: 24.07.2018
Mesajlar: 206

Ajax ile silme işlemleri

Selam, bu kara günde bir umutla herkese iyi günler olması dileğiyle,

Bir kaç gün önce açtığım konuda ajax ile silme işlemlerim doğru değil demiştiniz, bende işlemleri değiştirdim ve yeni konu açarak buraya yazmak istedim belki benim gibi çaylak birine bir faydası olur ve işlemlerin doğru olup olmadığını size sormak istedim. Aşağıda yaptığım ajax işlemleri doğru mu ?

Kontrolcü:

    public function deleteData(Request $request)
    {
        $id = $request->id;

        $user_delete = User::destroy($id);

        if ($user_delete) {
           return response()->json([
                'success' => 'İşlem başarıyla gerçekleşti !',
            ], 200);        
        } else {
            return response()->json([
                'errors' => 'İşlem gerçekleştirilemedi !',
            ]);
        }
    }

Javascript:

$.ajax({
	method: "post",
	url: "{{route('app.routes.deletedata')}}",
	data: form.serialize(),
	dataType: "json",

	success: function(response) {

		if (response.errors) {
			console.log(response.errors);
		}

		if (response.success) {
			console.log(response.success)
		}
	}
});

Çevrimdışı

#2 02.07.2019 13:59:44

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

Yanıt: Ajax ile silme işlemleri

ben olsam şöyle yazarım..

/**
     * delete user data from database
     * 
     * @param Request $request
     */
    public function deleteData(Request $request)
    {
        $id = $request->id;
        
        if(is_numeric($id)){

            //değişkenler camelCase olmalı.
            $userDelete = User::destroy($id);

            if ($userDelete) {
                return response()->json([
                    'success' => 'İşlem başarıyla gerçekleşti !',
                ], 200);
            }
        }
        
        return response()->json([
            'errors' => 'İşlem gerçekleştirilemedi !',
        ]);
    }

if else tasarımları içinde return varsa else methoduna gerek yoktur.

json methodu api tasarımı açısından method ismi olarak doğru değildir.Her ne kadar method içerisinde adapter değiştirilsede.
Method ismi refactore tabiidir ve iş yükü oluşturabilir.

request()->output();

olabilir... iyi çalışmalar.


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

Çevrimdışı

#3 02.07.2019 15:24:48

neri
Üye
Kayıtlı: 24.07.2018
Mesajlar: 206

Yanıt: Ajax ile silme işlemleri

@deathisonitsway teşekkür ederim hocam açıklayıcı bilgiler için.

Çevrimdışı

#4 02.07.2019 16:53:39

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

Yanıt: Ajax ile silme işlemleri

Model::destroy() yöntemi sırasında deleting ve deleted olayları da ateşlenir. Eğer modelin bu olaylarında işlem yaptırıyorsanız hata verme ihtimali var. Ayrıca veritabanı ile ilgili bir hata alma şansınız da var. O yüzden işlemi try...catch... bloğu içerisinde yapın derim.

Ayıca destroy yöntemi delete yönteminin toplu versiyonudur. Model::destroy([1, 2, 3]) şeklinde toplu sildirme yapabilirsiniz. Sonuç olarak ise silinen kayıt sayısını dönderiyor. Bir sebepten ötürü üç kayıttan sadece ikisi silinir biri silinmez ise (örneğin birinde deleting olayı ile işlem yapılıyorsa ve işlem yarıda kesilirse/false dönerse) sizin kontrol şekli yine de true dönecektir çünkü $user_delete değeri 2 olacaktır. Bunu da toplu silme sırasında göz önünde bulundurun.

Ben bazı sorunları yaşamamak için her zaman önce silinecek kaydın olup olmadığını kontrol ediyorum çünkü destory işleminin aksine delete işlemi kayıt olsun olmasın daima true dönüyor.

Çevrimdışı

#5 02.07.2019 19:14:59

neri
Üye
Kayıtlı: 24.07.2018
Mesajlar: 206

Yanıt: Ajax ile silme işlemleri

@mgsmus hocam tam da model içerisinde delete işlemi yapmak üzereyim, bilgiler için teşekkür ederim.

Deleted ve deleting işlemleri arasındaki fark tam olarak nedir ? Yani modelden bir kayit silerken iliski kurdugum diger modelden de o id ye ait kayidi silmek icin mesela hangisini kullanmam gerek ?

Son düzenleyen neri (02.07.2019 19:33:11)

Çevrimdışı

#6 02.07.2019 19:48:37

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

Yanıt: Ajax ile silme işlemleri

deleting model silinmeden hemen önce; deleted ise model silindikten sonra ateşlenen olaydır. İlişkili alt kayıtları deleting olayı içerisinde silin ama örneğin kayda ait bir dosya varsa bunu deleted ile yapın.

app/Album.php

protected static function boot() 
{
    parent::boot();

    static::deleting(function($album) {
        foreach ($album->photos as $photo) {
            $photo->delete();
        }
    });

    static::deleted(function($album) {
        Storage::delete($album->cover);
    });
}

app/Photo.php

protected static function boot() 
{
    parent::boot();

    static::deleted(function($photo) {
        Storage::delete($photo->file);
    });
}
$album = Album::findOrFail($id);
$album->delete(); // Albüm, albümün kapak resmi, albüme ait Photo modelleri ve bu modellerde bulunan resimler silinmiş oldu.

Çevrimdışı

#7 02.07.2019 20:04:16

neri
Üye
Kayıtlı: 24.07.2018
Mesajlar: 206

Yanıt: Ajax ile silme işlemleri

@mgsmus hocam cok degerli bilgiler tesekkur ederim.

Çevrimdışı

#8 02.07.2019 20:38:59

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

Yanıt: Ajax ile silme işlemleri

@mgsmus , hocam Album modelinde boot methodunu override ederken eklediğiniz şu alan ;

 static::deleted(function($album) {
        Storage::delete($album->cover);
    });

tam olarak nasıl çalışıyor ? 
cover isimli default bir değer mi var ?

$album = Album::findOrFail($id);
$album->delete(); // Albüm, albümün kapak resmi, albüme ait Photo modelleri ve bu modellerde bulunan resimler silinmiş oldu.

Herhangi bir relation kurmadan dosyaları nasıl siliyor , kafam karıştı açıkcası.

Çevrimdışı

#9 02.07.2019 21:43:36

neri
Üye
Kayıtlı: 24.07.2018
Mesajlar: 206

Yanıt: Ajax ile silme işlemleri

@coder2 hocam cover tabloda tutulan yolun sütunudur muhtemelen. Senin soruna ek olarak bende şunu sorayım oradaki değişken nerden geliyor ?

Son düzenleyen neri (02.07.2019 22:55:59)

Çevrimdışı

#10 03.07.2019 00:27:21

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

Yanıt: Ajax ile silme işlemleri

@coder2
Ben Album ile Photo modeli arasında ilişki olduğunu varsaydım, konu o olmadığı için kod olarak belirtmedim. Album ile Photo arasında one-to-many ilişkisi olduğunu varsayın.
Oradaki $album değişkeni o sırada işlem yapılan Album modelinin örneği (instance) oluyor. Örneğin o sırada silinen Album id'si 5 olan album olsun, bu durumda $album = Album::find(5) gibi düşünebilirsiniz. Album::$cover alanı da örnek, size göstermek için modelde öyle bir alan olduğunu varsaydım. Aşağıda neri'ye o değişkenin ne olduğunu, nasıl olduğunu anlattım.

@neri
Ordaki değişken, yani $album, bir yerden gelmiyor. Onu siz veriyorsunuz. Oradaki değişken zaten $album değil, function($album) {} şeklinde fonksiyonun komple kendisi deleted yönteminin değişkeni. Buna anonim fonksiyon denir, üstteki gibi anonim fonksiyonun başka bir fonksiyonun parametresi olarak kullanımına da genellikle callback denir. Javascript'te karşınıza çok çıkar. Yani üstteki örnekte aslında static::deleted($callback) olmuş oluyor. deleted yöntemi ateşlenip işlemler yapıldıktan sonra Laravel sizin bu anonim fonksiyonun parametresine modelin o anki örneğini yükletip geri dönderiyor. Dönen anonim fonksiyon olduğu için direk çalışıyor, $album değişkeni de coder2'ye verdiğim cevaptaki gibi Album modelinin o anki örneği oluyor. İçeride kullanabilmeniz için. Şöyle bir örnek vereyim mesela:

class Message
{
    public function get()
    {
        return "Merhaba Dünya";
    }
}

class Messenger
{
    public function give($callback)
    {
        return $callback(new Message);
    }
}

$messenger = new Messenger();

$messenger->give(function($message) {
    echo $message->get(); // Merhaba Dünya
});

https://www.php.net/manual/en/functions.anonymous.php

Çevrimdışı

#11 03.07.2019 08:03:05

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

Yanıt: Ajax ile silme işlemleri

@mgsmus , şimdi taşlar yerine oturdu hocam. Teşekkürler.

Çevrimdışı

#12 03.07.2019 09:46:36

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

Yanıt: Ajax ile silme işlemleri

şimdi mgsmsun yazdıklarını görünce hata çok bariz burada @neri..

destroy modeli sayı dönüyor.yani kaç kayıt sildiyse o kadar counter yapıp o sayıyı döndürüyor sana.
yani 0 icin false yakalarsın ama diğerleri için tümden true gelir.Arada birini silemezse yine true gelcek sana.
O yüzden bu destroy modelini kullanırken dikkat etmelisin.

Destroy methodunun alacağı parametreler;

destroy([1,2,3]);

destroy(1);

destroy(Collection::class) // ılluminate/support/collection instance

delete methodu da her türlü true dönderiyor.Onada güvenmemelisin.

öncesi ve sonrası olaylar cok basit..laravel bazı methodlar için fireModelevent çalıştırıyor.bunla deleting deleted saving saved updating updated replicating gibi method kullanımlarıyla yapıyor.bu methodları tespit ettiğinde callback değeri event mekanizmasına listen aracılığı ile kaydediyor.

ve daha sonra dispatch yapıyor bu callback değeri.yani oncesinde [ing] ler sonrasında [ed] ler çalıştırılıyor.

en iyi tutarlılığa sahip model event çalıştırılacak kısım bence save methodu.
save kaydedilip kaydedilmediğini yada şöyle söyleyeyim.

model event icin saving calıstırıyor yani oncesinde bir event..başarısızsa boolean false dönderiyor.Eğer true gelirse ana queryi calıstırıyor yani save provess...eğer buradan kayıt başarısız dönerse false dönderiyor ve model saved calıstırılmıyor.

delete felan komple her türlü true dönderiyor.

Son düzenleyen deathisonitsway (03.07.2019 09:54:48)


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

Çevrimdışı

#13 03.07.2019 11:31:10

neri
Üye
Kayıtlı: 24.07.2018
Mesajlar: 206

Yanıt: Ajax ile silme işlemleri

Dostlar cok aciklayici olmus cevaplar satir satir yazi yazan emiginize tesekkur ederim. Kodlari sayenizde refactor edebiyoruz daha duzgun kod yaziyoruz smile

Aslinda bu konuyla ilgili sunu da merak ediyorum bazi paketlerin birden fazla tablosu oluyor ama delete islemi yapinca tablolar birbiryle iliskili olsa da diger kayit silinmeyebiliyor, bu delete islemini paketin kendi modelinde yapamayiz galiba cunku composer update yapinca islemler resetlenir saniyorum. AppServiceProvider icinde mi yapmaliyiz ?

Çevrimdışı

#14 03.07.2019 12:11:35

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

Yanıt: Ajax ile silme işlemleri

Esasen relationshipe sahip tablolar da mysql olarak foreign key kullanmalısın.yani tablo bir üst tabloya foreign key olarak bağlı olmalı.
Eğer birbirine bağlı verilerden herhangi birine sahip ve kullanıcı bunu silmek istiyorsa foreign key engel olacaktır buna.
Tam tersi durumlar içinde, yani foreign keyi olan bir veri için tüm bağlı ilişkileri silsin istiyorsan bu seferde foreign keye bağlı option olarak ON_DELETE_CASCADE yöntemini kullanacaksın..

Hiç bir foreign keye bağlı olmayan veriler için birden fazla tablo ilişkisel yada ilişkisel olmayan(multiple data) veri silme için..

https://laravel.com/docs/5.8/database#d … ansactions

laravelin transaction yöntemini kullanmalısınız.Kacınılmazdır ve veri kaybını önleyecektir.
Transaction kullandığınızda herhangi bir tabloda çoklu kayıtlarınızda herhangi bir arıza olduğunda database rollback yaparak size hata donecektir.


UYARI: sakın composer satıcı dosyalarına müdahale etmeyin.Aptalca bir yöntemdir.

İyi calısmalar.

Son düzenleyen deathisonitsway (03.07.2019 12:13:07)


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

Çevrimdışı

#15 03.07.2019 15:11:40

neri
Üye
Kayıtlı: 24.07.2018
Mesajlar: 206

Yanıt: Ajax ile silme işlemleri

@deathisonitsway tamam hocam bilgiler için teşekkür ederim.

Çevrimdışı

Forum alt kısmı