如何在编辑日历的事件视图中从日历的事件中删除照片?在事件列表中,我确实删除了方法,并且该方法有效。现在,当我尝试在edit.blade.php中执行相同操作时,它会显示错误:
Call to a member function photos() on null
我有两个表,一个日历与多张照片有关系,文件上传有效,但是我停留在编辑部分。
看看我的控制器功能:
public function deletePhoto(CalendarRepository $calRepo, $id)
{
$calendars = $calRepo->find($id);
$calendars->photos($id)->delete();
return redirect()->action('CalendarController@edit');
}
这是edit.blade.php的片段:
<div class="form-group">
<label for="photo">Photo:</label>
<div class="row">
@foreach(($calendar->photos) as $photo)
<div class="col-md-3">
<div class="admin-thumbnail">
<img class="img-responsive" src="/storage/{{ $photo->filename }}" style="width:100px; height:auto;"/>
</div>
<a href="{{ URL::to('calendar/deletePhoto/' . $photo->id ) }}" onClick="return confirm('Are you sure?')"><i class="fas fa-times"></i>Remove</a>
</div>
@endforeach
</div>
</div>
我需要从“照片”表中删除照片,然后重定向到edit.blade.php(关于日历的特定事件ID)
感谢您的帮助。
编辑:
<div class="card-body">
<form action="{{ action ('CalendarController@editStore')}}" method="POST" enctype="multipart/form-data">
<input type="hidden" name="_token" value="{{csrf_token() }}"/>
<input type="hidden" name="id" value="{{ $calendar->id }}"/>
<input type="hidden" name="_token" value="{{csrf_token() }}"/>
<div class="form-group">
<label for="photo">Photo:</label>
<div class="row">
@foreach(($calendar->photos) as $photo)
<div class="col-md-3">
<div class="admin-thumbnail">
<img class="img-responsive" src="/storage/{{ $photo->filename }}"/>
</div>
<form method="POST" action="{{ route('photo.delete', ['calendar' => $calendar, 'photo' => $photo]) }}">
@csrf
@method("DELETE")
<a onClick="return confirm('Are you sure?')"><i class="fas fa-times"></i>Remove</a>
</form>
</div>
@endforeach
</div>
</div>
<div class="form-group">
<label for="header">Header</label>
<input type="text" class="form-control" name="header" value="{{ $calendar->header }}"/>
</div>
<div class="form-group">
<label for="description">Description</label>
<input type="text" class="form-control" name="description" value="{{ $calendar->description }}"/>
</div>
<div class="form-group">
<label for="date">Date</label>
<input type="date" class="form-control" name="date" value="{{ $calendar->date }}"/>
</div>
<input type="submit" value="Save" class="btn btn-primary"/>
</form>
</div>
答案 0 :(得分:1)
您使用相同的$id
查找照片和日历实例。
不建议您使用GET请求删除资源,因此更好的方法是在您的路由中添加以下内容:
Route::delete('photo/{photo}', 'PhotosController@delete')->name('photo.delete');
然后在您的视图中,您应该在按钮周围加上一个窗体,例如:
<form method="POST" action="{{ route('photo.delete', $photo) }}">
@csrf
@method("DELETE")
<a onClick="return confirm('Are you sure?')"><i class="fas fa-times"></i>Remove</a>
</form>
然后,如果用户接受删除照片,则JS中的confirm
函数应提交表单。还要记住,在Confirm函数中默认将false返回为默认值,因此默认情况下它不会提交表单。
您的控制器将是:
public function delete(Photo $photo)
{
$photo->delete();
return redirect()->back();
}
---编辑
Route::delete('calendar/{calendar}/photo/{photo}', 'CalendarController@deletePhoto')->name('photo.delete');
,表单中的操作可以是:
{{ route('photo.delete', ['calendar' => $calendar, 'photo' => $photo]) }}
控制器中的方法:
public function deletePhoto(Calendar $calendar, Photo $photo)
{
$calendar->photos()->where('id', $photo->id)->delete();
return redirect()->action('CalendarController@edit');
}