Giriş yapmadınız.

#1 21.05.2019 00:10:17

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

Veritabanından kayıt silindiğinde dosyanında silinmesi

Selamlar,

Veritabanı sütununda Storage ile yüklenen dosyanın yolu duruyor, veritabanından kayıt silindiğinde controller'da işlem yapmadan bu dosyayı silmek mümkün mü ?

Çevrimdışı

#2 21.05.2019 00:30:28

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

Çevrimdışı

#3 21.05.2019 00:34:22

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

Yanıt: Veritabanından kayıt silindiğinde dosyanında silinmesi

sineld yazdı:

Model Events tam da dediğinizi yapar:

https://laravel.com/docs/5.8/eloquent#events

Teşekkür ederim hocam inceliyorum.

Çevrimdışı

#4 21.05.2019 03:04:07

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

Yanıt: Veritabanından kayıt silindiğinde dosyanında silinmesi

Product modelinde, veritabanında images şeklinde json formatında görsellerin isimlerini tuttuğum bir uygulamam var. Görsel isimleri;

image1_thumb.jpg
image1_medium.jpg
image1_large.jpg

şeklinde. Bu durumda aşağıdaki betik ile Product modelinde silinme gerçekleşince resimlerin de silinmesini sağlıyorum:

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

    self::deleting(function ($product) {
        if (!empty($product->images)) {
            foreach (json_decode($product->images) as $image) {
                $imageUrl = public_path('uploads') . '/' . explode('.', $image)[0] . '*';
                array_map('unlink', glob($imageUrl));
            }
        }
    });
}

Çevrimdışı

#5 21.05.2019 09:02:59

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

Yanıt: Veritabanından kayıt silindiğinde dosyanında silinmesi

sineld yazdı:

Product modelinde, veritabanında images şeklinde json formatında görsellerin isimlerini tuttuğum bir uygulamam var. Görsel isimleri;

image1_thumb.jpg
image1_medium.jpg
image1_large.jpg

şeklinde. Bu durumda aşağıdaki betik ile Product modelinde silinme gerçekleşince resimlerin de silinmesini sağlıyorum:

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

    self::deleting(function ($product) {
        if (!empty($product->images)) {
            foreach (json_decode($product->images) as $image) {
                $imageUrl = public_path('uploads') . '/' . explode('.', $image)[0] . '*';
                array_map('unlink', glob($imageUrl));
            }
        }
    });
}

Hocam tesekkur ederim.

Event ile cozemedim herseyi dökümantasyondaki gibi yaptım ama 500 hatasi aliyorum sanirim storage calismiyor listener icinde veya ben bi yerde ciddi bi hata yapiyorum.

Son düzenleyen neri (21.05.2019 12:31:39)

Çevrimdışı

#6 21.05.2019 12:15:58

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

Yanıt: Veritabanından kayıt silindiğinde dosyanında silinmesi

self yerine static::deleting dener misiniz?


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

Çevrimdışı

#7 21.05.2019 14:42:13

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

Yanıt: Veritabanından kayıt silindiğinde dosyanında silinmesi

deathisonitsway yazdı:

self yerine static::deleting dener misiniz?

Malesef, foreign key ile bağlı olduğu kayıt silindiğinde kayıtın kendisi de siliniyor ancak dosyasını silmeyi başaramadım hala.

Çevrimdışı

#8 21.05.2019 14:55:21

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

Yanıt: Veritabanından kayıt silindiğinde dosyanında silinmesi

Kodu paylaşın.

Çevrimdışı

#9 21.05.2019 15:36:40

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

Yanıt: Veritabanından kayıt silindiğinde dosyanında silinmesi

mgsmus yazdı:

Kodu paylaşın.

Aşağıdaki  makale tablosu

        Schema::create('articles', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->unsignedBigInteger('blog_id')->nullable();
            $table->string('title')->nullable()->unique();
            $table->string('slug')->nullable();
            $table->text('description')->nullable();
            $table->text('content')->nullable();
            $table->string('cover')->nullable();
            $table->string('author')->nullable();
            $table->timestamps();

            $table->foreign('blog_id')
            ->references('id')
            ->on('blogs')
            ->onDelete('cascade');
       });

cover sütunu Storage ile kapak fotoğrafı olan dosyanın yüklendiği yolu tutuyor, makaleler bloglara foreign key ile bağlı bir blog silindiğinde makaleler gibi dosyanında silinmesini istiyorum, aslında foreign key'i ilk sorumda belirtmem lazımdı unutmuşum kusura bakmayın. Dosya silme işlemini iki controller içinde de yapabilirim ama laravelin controller da tekrar kod yazmadan dosyaları silebileceğine inanıyorum ama ben bilmiyorum.

Çevrimdışı

#10 21.05.2019 15:51:20

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

Yanıt: Veritabanından kayıt silindiğinde dosyanında silinmesi

// Article.php
public static function boot()
{
    parent::boot();

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

// Blog.php
public static function boot()
{
    parent::boot();

    static::deleting(function($blog) {
        foreach($blog->articles as $article) {
            $article->delete();
        }
    });
}

Çevrimdışı

#11 21.05.2019 16:09:09

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

Yanıt: Veritabanından kayıt silindiğinde dosyanında silinmesi

mgsmus yazdı:
// Article.php
public static function boot()
{
    parent::boot();

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

// Blog.php
public static function boot()
{
    parent::boot();

    static::deleting(function($blog) {
        foreach($blog->articles as $article) {
            $article->delete();
        }
    });
}

Teşekkür ederim hocam diğer yanıt veren üstatlara da ayrıca teşekkürler.

Çevrimdışı

Forum alt kısmı