Laravel Eloquent:路由模型绑定不能与多字表名

时间:2017-04-27 10:02:58

标签: php laravel laravel-5 eloquent laravel-eloquent

我正在使用ajax与我的销毁路线进行删除调用以获取模型。 一切正常,但控制器与数据库中的相应记录不匹配。

我拨打了api/serviceoperations/17 ajax 删除电话,但如果我以这种方式在我的控制器中放置var_dump

    public function destroy(ServiceOperation $serviceOperation) {
        var_dump($serviceOperation);die;
    }

我得到一个不存在的空模型

 public 'exists' => boolean false

我当然有一个名为 ServiceOperation 模型引用表 service_operations ,其中包含主键 id,在我的数据库中有一个记录,其中包含密钥17

为什么控制器没有解析我的id到db中相对记录的路径?

<小时/> 更新(已解决):

使用命令

创建模型,控制器和迁移
php artisan make:model -m -c -r App\Models\ServiceOperation

无论如何,似乎laravel并没有很好地用一个世界来表达这个名字:
虽然上面的命令适用于一个单词表名称(即App \ Model \ Service),但它不适用于2个或更多,因为它不会自己绑定路径中传递的模型。 / p>

解决方案是在控制器中使用全小写字符的输入变量名 在我的例子中,控制器中的自动生成销毁功能是

    public function destroy(ServiceOperation $serviceOperation) {
        //model bind not working
    }

但是模型绑定并没有起作用。

将参数更新为小写字符串,解决问题,模型绑定有效:

    public function destroy(ServiceOperation $serviceoperation) {
        //model bind working
    }

4 个答案:

答案 0 :(得分:4)

解决方案是在控制器中使用全小写字符的输入变量名 在我的例子中,控制器中的自动生成销毁功能是

    public function destroy(ServiceOperation $serviceOperation) {
        //model bind not working
    }

但模型绑定无效。

将参数更新为小写字符串,解决问题,模型绑定有效:

    public function destroy(ServiceOperation $serviceoperation) {
        //model bind working
    }

答案 1 :(得分:1)

试试这个:

public function destroy(ServiceOperation $serviceOperation, $id) {
    $resource = $serviceOperation->find($id);

    return $resource->delete();
}

看,如果有帮助。

答案 2 :(得分:1)

问题出在路由文件中提供的通配符中 Route::get('/serviceoperation/{wildcard}', 'PostsController@destroy'); {wildcard}必须与您的控制器匹配

public function destroy(ServiceOperation $wildcard) {
        //model bind working
    }

只要这两个名称都匹配,只要通配符是id,模型绑定就将起作用

答案 3 :(得分:0)

你可以用这个东西解决 -> Laravel explicit bindings.
您可以在 RouteServiceProvider 启动方法中进行显式绑定,如下所示:

/**
 * Define your route model bindings, pattern filters, etc.
 *
 * @return void
 */
public function boot()
{
    parent::boot();

    Route::model('ServiceOperation', \App\ServiceOperation::class);
}