2016-08-20 60 views
0

我的Laravel 4.2項目存在一些問題。 我有一個Photo模型和一個Service模型與關係Service hasMany PhotosLaravel刪除方法:如何刪除相關文件

照片(文件)存儲在public/upload/目錄中。 當我刪除照片(在Photo方法delete())刪除該文件的形式在服務器(如下圖所示的代碼),但是當我(在Service方法delete())刪除Service數據庫條目Service和它的所有照片(DB記錄)被刪除,但文件甚至沒有當我觸發$this->photos()->delete();

我放在Log::debug('photos->delete() fired');Photo->delete()方法,如果我直接調用它它的射擊,當我嘗試通過Service->delete()啓動它有沒有日誌條目。 我不知道爲什麼它會這樣。誰能幫忙?

這是我的代碼Service

public function photos() 
{ 
    return $this->hasMany('Photo'); 
} 
public function delete() 
{ 
    $this->photos()->delete(); 
    parent::delete(); 
} 

而且Photo

public function delete() 
{ 
    Log::debug('photos->delete() fired'); 
    $file = public_path().'/upload/'.$this->filename; 
    if(File::isFile($file)){ 
     File::delete($file); 
    } 
    parent::delete(); 
} 

回答

1

您可以創建Observer模式刪除事件模型是指這個link

+0

這是工作,如果我刪除模型直接'光電>刪除()'但是,當它通過推出'Service()'('$ this-> photos() - > delete()')它根本不運行。 – violator667

2

首先,沒有必要到overloaddelete()方法。

在你的數據庫中,建立服務和照片以及onDelete級聯之間的關係。

刪除文件,添加一個事件監聽到照片模式:

class Photo extends Eloquent { 


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

    Photo::deleted(function($photo){ 
     $file = public_path().'/upload/'.$photo->filename; 
     if(File::isFile($file)){ 
       File::delete($file); 
     } 
    }); 
} 

}

+0

我不能改變數據庫模式,所以設置'onDelete cascade'是不可能的。正如我測試你的解決方案不工作沒有數據庫的變化。無論如何謝謝 – violator667

+0

我爲文件刪除部分提供的解決方案不依賴於數據庫更改。 –