【问题标题】:Laravel patch method just refreshes page, doesn't update database fieldsLaravel 补丁方法只是刷新页面,不更新数据库字段
【发布时间】:2019-04-18 19:45:42
【问题描述】:

控制器功能:

    public function setFlag(Request $request)
{
    $user = User::find((int)$request->input('id'));
    $user->flag = 1;
    $user->save();
}

刀片文件

@extends ('layouts.app')
@section('content')
@if($user->user_picture)
    <img src= "data:{{$user->user_picture_type}};base64,{{$user->user_picture}}" height="100" width="100">
@else
    <img src="{{ URL::to('/') }}/images/blankProfile.png" height="100" width="100">
@endif
<div>Name: {{$user->name}}</div>
<div>Bio: {{$user->bio}}</div>
<div>Child Bio: {{$user->child_bio}}</div>
<div>Parent Age: {{$user->parent_age}}</div>
<div>Child Age: {{$user->child_age}}</div>
<div>City: {{$user->city}}</div>
<div>State: {{$user->state}}</div>
<a href="/ratings/{{$user->id}}"><button type="submit" class="btn btn-primary">View Users Ratings</button></a>
<br />
<br />
  {{Form::open(array('action' => array('ProfileController@setFlag', $user->id), 'method' => 'PATCH'))}}
 {{ csrf_field() }}
 <input type="hidden" value = "{{$user->id}}" id = "id" name = "id">
<button type="submit" class="btn btn-primary">Report User</button>
{{Form::close()}}
@if(Auth::user()->level == 1)
    <br />
    <br />
    <a href="/"><button type="submit" class="btn btn-primary">Delete User</button></a>
    @if($user->flag == 1)
    <a href="/"><button type="submit" class="btn btn-primary">Unflag</button></a>
    @endif
@endif  
@endsection

配置文件控制器的所有路由:

Route::get('/profile', 'ProfileController@index')->middleware('auth')->name('profile.index');
Route::get('/profile/edit', 'ProfileController@edit')->middleware('auth');
Route::resource('profile', 'ProfileController')->middleware('auth');
Route::get('/profile/{userID}', 'ProfileController@show')->middleware('auth');
Route::patch('/profile/{userID}','ProfileController@setFlag')->middleware('auth');

所以我的问题是当用户单击提交按钮时,它只是刷新页面并且在控制器内部什么都不做。我在控制器内部有一个 dd($request) ,它甚至从未命中 dd。我花了几个小时尝试不同的解决方案,但到目前为止没有任何效果。我尝试更改路由名称,使用默认的 html 表单,以不同的方式使用 laravel 表单,弄乱控制器,并尝试在按下按钮时强制为特定用户设置标志,但这些都不起作用。

我认为问题与路由有关....但我不知道如何路由默认 Route::resource 中未包含的补丁方法。是因为 /profile/{userID} 有两条不同的路由吗?感谢您的帮助,感谢您的宝贵时间

编辑:profilecontroller 内部的更新函数

 public function update($id, Request $request)
    {                
        $user = User::find(Auth::user()->getId());          

        $request->validate([
                'name' => 'required',
                'image' => '|image|mimes:jpeg,png,jpg,svg|max:2048',
                'bio' => 'required',
                'child_bio' => 'required',
                'parent_age' => 'required|integer|min:18',
                'city' => 'required',
                'state' => 'required',
                'child_age' => 'required|integer|between:1,8',

        ]);
        if($request->hasFile('image')) {
            $user_picture = base64_encode(file_get_contents($request->file('image')));
            $user_picture_type = $_FILES['image']['type'];

            DB::table('users')->where('id', $id)->update(
                [
                    'user_picture' => $user_picture,
                    'user_picture_type' => $user_picture_type
                ]
            );
        }


        $name = $request->input('name');
        $bio = $request->input('bio');
        $child_bio = $request->input('child_bio');
        $parent_age = $request->input('parent_age');
        $city = $request->input('city');
        $state = $request->input('state');
        $child_age = $request->input('child_age');
        $geocoder = new \OpenCage\Geocoder\Geocoder('8c0bbd03698f4bdaa4e35fe38c30fbd1');
        $result = $geocoder->geocode($city . ' ' . $state);
        $first = $result['results'][0];
        $lat = $first['geometry']['lat'];
        $lng = $first['geometry']['lng'];
        //$level = 1;        


        DB::table('users')->where('id', $id)->update(
            [
                'name' => $name,
                'bio' => $bio,
                'child_bio' => $child_bio,
                'parent_age' => $parent_age,
                'city' => $city,
                'state' => $state,
                'child_age' => $child_age,
                'lat' => $lat,
                'lng' => $lng,

            ]
        ); 
       return redirect('/profile');

    }

【问题讨论】:

    标签: laravel


    【解决方案1】:

    首先你可以检查你收到什么类型的数据

        public function setFlag(Request $request)
    {
        dd($request);
        //$user = User::find((int)$request->input('id'));
        //$user->flag = 1;
        //$user->save();
    }
    

    如果一切正常,那么您可以检查用户模型,然后您可以找到相同的 id 并更新您想要的内容

    【讨论】:

    • protected $fillable = ['name', 'email', 'verified', 'password', 'bio', 'child_age', 'city', 'state', 'child_bio', ' parent_age','user_picture','user_picture_type','gender','flag',];我在我的用户模型中有这个。我尝试抛出一个 dd($request) 但它从未在控制器中被击中。这就是为什么我真的很困惑。它甚至没有击中控制器。
    • 这意味着问题出在控制器上。所以首先我们要解决这个问题
    • 我展示了你可以使用资源并且你可以再次使用补丁。但为什么??如果您可以使用资源,那么它对所有人都有效
    • 这就是我认为的问题所在。我正在使用补丁,因为它将数据库中的 1 个字段更新为固定数字。我应该在公共函数 update() 中执行此操作吗?里面已经有很多代码了。这就是为什么我创建了一个名为 setFlag 的新函数,因为 update 已经被使用了。
    • 我在帖子中添加了我的更新功能。里面已经有很多代码了,所以我不确定我是否仍然可以使用该功能。
    猜你喜欢
    • 2020-04-28
    • 1970-01-01
    • 1970-01-01
    • 2021-07-26
    • 2016-10-22
    • 2016-12-24
    • 2016-09-27
    • 2013-12-03
    • 1970-01-01
    相关资源
    最近更新 更多