2017-01-05 1 views
0

Ich habe ein Elternmodell und ein Kindmodell, sagen Kategorien und Beiträge. Das Post Modell kann eine vorgestellten Bild, um es angebracht, die aus dem Speicher entfernt werden muss, wenn der Beitrag gelöscht wird, so in meinem PostController meine destroy Methode sieht wie folgt aus:Löschen von Kindmodell mit zusätzlicher Logik

public function destroy($id) 
{ 
    $post = Post::findOrFail($id); 

    if ($post->featured_image_path) { 
     Storage::delete($post->featured_image_path); 
    } 

    $post->delete(); 

    return redirect('/admin/posts'); 
} 

Mein CategoryController hat eine ähnliche destroy Verfahren, es muss aber auch jedes seiner Post s entfernen, wenn es zerstört wird. Ich weiß, dass ich einen Fremdschlüssel verwenden und mich auf die Beziehung verlassen kann, um die Beiträge zu löschen, aber wenn das geschieht, werden die vorgestellten Bilder nicht aus dem Speicher entfernt. Ich könnte jede $category->posts() in meiner [email protected] Methode durchlaufen und nach vorgestellten Bildern suchen, aber es scheint nicht richtig, diese Logik an mehreren Orten zu duplizieren.

Was ist der beste Weg, um die Logik von der destroy Methode auf meinem Post laufen, wenn ein Category im CategoryController zu löschen?

+0

abfeuern können Ich denke, es ist besser für alle zu sammeln 'post- $> featured_image_path' in einem Array oder etwas dann zu einem Cleanupauftrag senden und mit dem normalen Beziehung fortfahren löscht . –

+0

@CerlinBoss Wie würden Sie den Bereinigungsjob an die Beziehung löschen binden? –

+0

wie ich schon sagte. Sammeln Sie zuerst den Speicherort der Dateien, die in einem Array gelöscht werden sollen, und senden Sie den Job zur Reinigung, um mit dem normalen Löschvorgang fortzufahren. Oder senden Sie den Bereinigungsjob nach dem erfolgreichen Löschen von '$ category' und' $ posts' –

Antwort

2

Sie können einen solchen Ansatz verwenden.

Ändern Sie Ihr Category Modell wie folgt.

class Categories extends Model 

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

     static::deleted(function ($object) { 
      // Logic to delete Post goes here... 
     }); 
    } 
} 

Post Modell wie folgt.

class Post extends Model 
{ 
    public static function boot() 
    { 
     parent::boot(); 

     static::deleted(function ($object) { 
      // Logic to delete FeatureImage goes here... 
     }); 
    } 
} 

Also, wenn jemals ein Category gelöscht wird Post ist entspricht, und dann wird die Image nach Ihrer Logik gelöscht werden.

Als Ergänzung Sie events innerhalb deleted() Methode

+0

Ich mag diesen Ansatz, vor allem mit der Möglichkeit, ein Ereignis auf Löschen auslösen. –

+0

Froh, Ihnen zu helfen :) – Gayan

+0

Auch lohnt sich https://laravel.com/docs/5.3/eloquent#observers –

Verwandte Themen