Как удалить изображение из папки в Laravel для родительского и дочернего случая

#laravel #eloquent

#laravel #красноречивый

Вопрос:

Я создал две базы данных, одна из которых является родительской, а другая дочерней. Родительская таблица содержит заголовок и столбец описания, а дочерняя таблица содержит столбец изображения для родительской строки. Теперь я хочу удалить строку из родительской таблицы и удалить изображение из папки, в которой оно хранится.

Я сделал:-

Код для удаления из баз данных, код для удаления из дочерней таблицы, а также удалить изображение из папки, в которую сохранено изображение, код для удаления строк из родительской таблицы.

Я не мог сделать:-

Код для удаления из папки, в которую изображение сохраняется при удалении родительской строки.

Мои контроллеры такие [

ProjectControllers управляет моей родительской таблицей ProjectImageControllers управляет моей дочерней таблицей

 //This is my ProjectControllers.php 

public function destroy(Project $project)
    {
        $projectImage = Project::find(request('id'));
        $deleted = $projectImage->delete();
        if($deleted){
            File::delete(public_path('/images/projects/').$projectImage->image);
        }

        $projectList = Project::all();
        return view('admin.project.adminProject', ['success'=> true, 'projectList' => $projectList ]);
    }
  

]

Также отношение моделей выглядит следующим образом[

это Project.php модель

 
class Project extends Model
{
    public function projectImages(){

        return $this->hasMany(ProjectImages::class);
    }
}


  

Это ProjectImages.php модель

 
class ProjectImages extends Model
{
    protected $fillable = [
        'image', 'project_id'
    ];
    public function project(){
        return $this->belongsTo(Project::class, 'project_id');
    }
}
  

]

Комментарии:

1. Возможно, это проблема с разрешением, попробуйте использовать unlink() вместо File::delete() и dd() результат, чтобы вы могли видеть, что не так. dd(unlink(public_path('/images/projects/').$projectImage->image));

2. Вы пытались отключить изображение перед удалением объекта модели?

3. Нет, это не работает. Возможно, нам нужно использовать цикл для удаления из файла по одному. Если не найдено в базе данных, то удалите и из файла .. или, может быть, что-нибудь еще.. Я очень новичок в кодировании, не могли бы вы помочь мне с концепцией цикла?

Ответ №1:

Пожалуйста, сначала получите строки дочерней таблицы, а затем удалите изображения в папке одно за другим следующим образом:

 public function destroy(Project $project)
{
   //first find the Parent object with the help of the id parameter.         
     $project = Project::find(request('id'));

   //find the children list of the parent
     $projectImages = ProjectImages::where('project_id','=',request('id'));

    //delete the images stored in your filesystem one by one 
     foreach($projectImages as $projectImage){

          File::delete(public_path('/images/projects/').$projectImage->image);

     }
    
    //Now,finally delete the parent table data. 
     $project->delete();
    

    $projectList = Project::all();
    
    return view('admin.project.adminProject', ['success'=> true, 'projectList' => $projectList ]);
}