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