首页 > 解决方案 > 在控制器上的字符串上调用成员函数 fill()

问题描述

我正在尝试获取 eloquent 的 ID 以编辑其列,但是当我在编辑页面中的列中进行更改并单击完成时,它会返回此错误。调用字符串上的成员函数 fill()

当我使用代码dd($id);时,它在 dd 页面上返回了“更新”一词。

路线

Route::group(['prefix' => 'admin/books'], function($book){

    Route::get('edit/{id}','BookController@getUrlBook')->middleware('auth');

    Route::post('edit/{book}','EditController@update')->middleware('auth');

    Route::get('edit/{id}','BookController@getUrlBook', function ($book) {
        return view('edit',[
            'id' => $book->id,
            'name' => $book->name,
            'writer' => $book->writer_name,
            'isbn' => $book->isbn,
        ]);
    })->middleware('auth');

    Route::post('create','EditController@create');

    Route::get('create', function () {
        return view('create');
    })->middleware('auth');

});

控制器

public function update(Request $request,$id){
        $this->middleware('auth');
        $imgExtensions = ['jpg','png','svg'];
        $id->fill($request->only(['name','writer_name','isbn']));
        if(null !== $request->book_image && in_array($request->file('book_image')->getClientOriginalExtension(), $imgExtensions )){
            $id->image = $request->file('book_image')->storeAs('images', $request->id.'.jpg');
        }
        $id->save();
        return redirect('/admin');
    }

标签: phplaravel

解决方案


如果我理解正确:

您从方法参数中获得的 $id 是您要更新的书的 id ...所以,您应该对书本模型使用 (fill) 方法而不是它的 id ...

public function update(Request $request,$id){
        $this->middleware('auth');
        $imgExtensions = ['jpg','png','svg'];
$book=Book::findOrFail($id);
        $book->fill($request->only(['name','writer_name','isbn']));
        if(null !== $request->book_image && in_array($request->file('book_image')->getClientOriginalExtension(), $imgExtensions )){
            $id->image = $request->file('book_image')->storeAs('images', $request->id.'.jpg');
        }
        $id->save();
        return redirect('/admin');
    }

另一个解决方案是使用 laravel 绑定:

Route::post('edit/{book}','EditController@update')->middleware('auth');

  public function update(Request $request,Book $book)  ....

现在 laravel 将为您从 db 获取 $book,并且您使用该路由的方式与之前使用它的方式相同


推荐阅读