更新或销毁方法在Laravel雄辩的模型中不起作用?

时间:2019-08-16 16:51:30

标签: laravel vue.js eloquent model

我有一个奇怪的情况,雄辩的模型既不允许我在索引和创建正常工作时也不进行更新或破坏!

我正在使用Vue.js和Laravel API资源进行表单控制,虽然以前与我一起使用过,但在这里无法使用:

这是我的Vue.js代码:

updateFinish(finish) {
    axios.patch(`/api/finishes/${finish.id}`, finish).then(response => { 
        this.fetchFinishes();
    }).catch(error => {
      // Get laravel validation error
      this.errors = error.response.data.errors;
   });
},

laravel更新代码(不起作用)

public function update(FinishType $finishType)
    {
        // Don't know why not working
        $finishType->update($this->validateRequest());
        return new FinishTypeResource($finishType);
    }

响应为null{"id":null,"name":null}

此代码有效:

public function update($id)
    {
        $finishType = FinishType::find($id);
        $validates = $this->validateRequest();
        $finishType->name = $validates['name'];
        $finishType->save();
        return new FinishTypeResource($finishType);
    }

public function validateRequest()
    {
        return request()->validate([
            'name' => 'required | unique:finish_types',
        ]);
    }

请注意,模型名称为FinishType,数据库表名称为finish_types,我什至试图在模型中定义表名称,例如protected $table = 'finish_types' –仍然无法正常工作,我已经拥有定义了$fillable数组!

2 个答案:

答案 0 :(得分:0)

我不能发表评论,所以我要发表我认为是答案的东西。

当路由网址名称与我认为的表或模型的名称相对应时,Laravel会自动进行路由模型绑定。

因此,users/{id}将在您在控制器中将其作为参数输入时自动绑定User对象。示例(User $user)

但是,由于您的URL似乎与模型/表的名称“不同”,因此请转到RouteServiceProvider,然后手动进行绑定。

因此,在您的情况下,您可以在RouteServiceProvider类的启动功能中执行以下操作:

public function boot()
{
    parent::boot();

    Route::model('finishes', FinishType::class);
}

不要忘记您的进口商品:)

您可以在此处阅读有关显式模型绑定的更多信息:https://laravel.com/docs/5.8/routing#explicit-binding

答案 1 :(得分:0)

您的路由模型绑定无法正常工作,为了使隐式绑定正常工作,您的injected variable应该与route parameter name相匹配。

假设您的参数名称可能为finish(从JavaScript中读取网址),则必须使用$finish作为注入变量来编写更新函数,如下所示:

public function update(FinishType $finish)
{
    $finish->update($this->validateRequest());
    return new FinishTypeResource($finish);
}

对destroy()做同样的事情:

public function destroy(FinishType $finish)
{
     // your destroy code here
}

在任何情况下,您都可以运行php artisan route:list来找到parameter name(括号中URI的一部分)并将相同的名称赋予injected variable

如果参数和注入的变量名称二者不匹配,则laravel注入一个未加载的{strong> void FinishType模型,因此对它进行更新或删除没有任何意义它。