2016-08-20 16 views
0

Laravel 4.2プロジェクトに問題があります。 私はPhotoモデルとServiceモデルとの関係がService hasMany Photosです。Laravel delete method:関連するファイルを削除する方法

写真(ファイル)はpublic/upload/ディレクトリに格納されます。 私は写真(Photoでメソッドdelete())を削除すると、ファイルがサーバーフォーム除去する(コードは、以下に示す)が、私はServiceとすべてのためのService(方法Servicedelete())データベースのエントリを削除すると、それは写真(DBレコード)が削除されているのですが、ファイル私はPhoto->delete()方法でLog::debug('photos->delete() fired');を置い$this->photos()->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()の方法。

DBでは、ServiceとPhoto、onDelete cascadeの関係を作成してください。

ファイルを削除するために、あなたの写真のモデルにイベントリスナーを追加します。

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

DBスキーマを変更できないので、 'onDelete cascade'を設定することはできません。私がテストしたように、あなたのソリューションはデータベースの変更なしでは動作しません。とにかくThanx – violator667

+0

私がファイル削除部に提供した解決策は、DBの変更に依存しません。 –

関連する問題