0

我的 Laravel 4.2 项目有一些问题。我有一个Photo模型和一个Service模型有关系Service hasMany Photos

照片(文件)存储在public/upload/目录中。当我删除照片(delete()中的方法Photo)时,文件从服务器中删除(代码如下所示)但是当我删除Servicedelete()中的方法Service)数据库条目时Service,它的所有照片(数据库记录)都被删除,但文件即使在我触发时也没有$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();
}
4

3 回答 3

3

overload首先,不需要delete()方法。

在您的数据库中,建立 Service 和 Photo 之间的关系,以及 onDelete 级联。

要删除文件,请将事件侦听器添加到您的 Photo 模型:

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);
         }
    });
}

}

于 2016-08-20T19:45:31.280 回答
1

您可以创建观察者模式以删除模型中的事件,请参阅此链接

于 2016-08-20T19:45:02.473 回答
0

不要File为模型和控制器使用变量名以避免冲突。$somefile变量或任何(您命名)将从控制器接收数据,因此您将获取filename文件。filename因此,此代码的表中必须有字段

<?php

namespace App\Models;

use File; 

class SomeFile extends Model {

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

            static::deleted(function($somefile)
            {
                $path  =   public_path().'/uploads/';

                $filename  = $somefile->filename;

                if (File::exists($path.$filename)) {
                    File::delete($path.$filename);
                }
            });
        }
}
于 2021-10-26T10:05:32.960 回答