Как разорвать связь между несколькими файлами в Laravel

#laravel #eloquent

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

Вопрос:

Я хочу разорвать связь со всеми файлами с именем из базы данных: имя файла в базе данных. Я пытаюсь использовать подобный код, но он не работает:

 public function destroy($id)
{
     $infokeg = Infokeg::where('id', $id)->first();
     $image[] = $infokeg->foto_kegiatan
     unlink(public_path("data_file/".json_decode($image)));
     $infokeg->delete();
     return redirect('infokeg')->with('msg', 'Data Telah Terhapus');
}
 

Ответ №1:

File::delete() обработает массив файлов, подлежащих удалению для вас,

Сначала добавьте его use IlluminateSupportFacadesFile;

 public function destroy($id)
{
 $infokeg = Infokeg::where('id', $id)->first();
 $image[] = $infokeg->foto_kegiatan  
 // pass the array of files to deleted to it. 
 // if $image array is like this $image = ['file1.jpg', 'file2.png'];
 File::delete($image);
 
 return redirect('infokeg')->with('msg', 'Data Telah Terhapus');
}
 

Способ 2

Сначала добавьте use IlluminateSupportFacadesStorage;

 public function destroy($id)
{
 $infokeg = Infokeg::where('id', $id)->first();
 $image[] = $infokeg->foto_kegiatan  
 // pass the array of files to deleted to it. 
 // if $image array is like this $image = ['file.jpg', 'file2.jpg'];
 Storage::delete($image);
 
 return redirect('infokeg')->with('msg', 'Data Telah Terhapus');
}

 

Для метода 2 обратитесь к документам


Редактировать:

добавить общедоступный путь ко всем,

 foreach ($image as amp;$value) {
   $value = public_path("data_file/".$value);
}
 

Он добавит общедоступный путь ко всем значениям в массиве, а затем использует его в методе delete() в качестве своего аргумента.

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

1. этот метод просто удаляет данные из базы данных, но изображение в общедоступном все еще существует

2. нет, оба метода будут удалены из общей папки, а также проверьте свой путь

3. у меня есть такой путь: public/data_file/myfile, так что я должен изменить, чтобы определить путь к файлу data_file?

Ответ №2:

использование for для его удаления

 public function destroy($id)
    {
       $infokeg = Infokeg::where('id', $id)->first();
       $image = json_decode($infokeg->foto_kegiatan);
       $length = count($image);
       for ($i = 0; $i < $length; $i  ) {
           unlink(public_path("data_file/".$image[$i]));
       }
       $infokeg->delete();
       return redirect('infokeg')->with('msg', 'Data Telah Terhapus');
   }