Поэтому я работаю с Laravel 5.2 API и работаю над созданием метода обновления для конкретной Модели. До сих пор методы index, show ($ id) и store работают нормально. Однако я получаю следующую ошибку в моей реализации метода обновления:
BadMethodCallException in Macroable.php line 81:
Method save does not exist.
Вот метод обновления:
public function update($id, CreateZoneRequest $request)
{
$zones = Zone::where('_id', '=', $id) -> get();
if(sizeof($zones) == 0){
return response()->json(['message' =>'That zone number is invalid', 'code' => 404], 404);
}
$description = $request->get('description');
$zones ->description = $description;
$zones ->save();
return response() -> json(['message' => 'The zone has been updated'], 200);
}
Вот код CreateZoneRequest:
<?php
namespace App\Http\Requests;
use App\Http\Requests\Request;
class CreateZoneRequest extends Request
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return
[
'description' => 'required',
];
}
public function response (array $errors){
return response() -> json(['message' => 'You are missing a required field', 'code' => 422], 422);
}
}
Вот метод индекса (для справки). Этот работает без проблем:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Requests;
use App\Zone;
use Illuminate\Support\Facades\Input;
use App\Http\Requests\CreateZoneRequest;
class ZoneController extends Controller
{
/**
* Display a listing of the resource.
*
* @return Response
*/
public function index()
{
$zones = Zone::all();
if(sizeof($zones) == 0){
return response()->json(['message' =>'There are no zones', 'code' => 404], 404);
}
return response() -> json(['data' => $zones], 200);
}
Вот подробное сообщение об ошибке при попытке использовать PUT на этой конечной точке api / v1 / zone / 1? Description = Blah
Когда вы используете get()
метод вы получаете Collection
объект. Вы должны использовать first()
метод для получения объекта модели.
Узнайте больше здесь: https://laravel.com/docs/5.2/eloquent#retrieving-single-models
Вы должны получить один экземпляр модели Zone с помощью first (), затем вы можете использовать методы save () или update ()
public function update($id, CreateZoneRequest $request)
{
$zones = Zone::where('_id', '=', $id) -> first();
if(sizeof($zones) == 0){
return response()->json(['message' =>'That zone number is invalid', 'code' => 404], 404);
}
$description = $request->get('description');
$zones ->description = $description;
$zones ->save();
return response() -> json(['message' => 'The zone has been updated'], 200);
}