Laravel Eloquent: 路由模型绑定不适用于多词 table 名称
Laravel Eloquent: route model binding not working with multi word table name
我正在使用 ajax 对模型的销毁路径进行删除调用。
一切正常,除了控制器与数据库中的相应记录不匹配。
我调用了一个 api/serviceoperations/17
ajax delete 调用,但是如果我以这种方式在我的控制器中放置一个 var_dump
:
public function destroy(ServiceOperation $serviceOperation) {
var_dump($serviceOperation);die;
}
我得到一个不存在的空模型
public 'exists' => boolean false
当然我有一个名为 ServiceOperation 的 model 指的是 table service_operations,使用 主键 id
,在我的数据库中有一条键为 17
.
的记录
为什么控制器不解析我的 id 到数据库中相关记录的路由?
更新(已解决):
模型、控制器和迁移是使用命令创建的
php artisan make:model -m -c -r App\Models\ServiceOperation
反正laravel好像不太好把table的名字和一个世界比起来:
虽然上面的命令适用于一个单词 table 名称(即 App\Model\Service),但它不适用于 2 个或更多,因为它不会自行绑定路由中传递的模型。
解决办法是在controller中使用输入变量名全小写
在我的例子中,控制器中的 auto generated destroy 函数是
public function destroy(ServiceOperation $serviceOperation) {
//model bind not working
}
但是模型绑定不起作用。
将参数更新为 小写 字符串,解决问题,模型绑定有效:
public function destroy(ServiceOperation $serviceoperation) {
//model bind working
}
试试这个:
public function destroy(ServiceOperation $serviceOperation, $id) {
$resource = $serviceOperation->find($id);
return $resource->delete();
}
看看,是否有帮助。
解决方法是在controller中输入变量名全部小写
在我的例子中,控制器中的 auto generated destroy 函数是
public function destroy(ServiceOperation $serviceOperation) {
//model bind not working
}
但是模型绑定不起作用。
将参数更新为 小写 字符串,解决问题,模型绑定有效:
public function destroy(ServiceOperation $serviceoperation) {
//model bind working
}
问题出在路由文件中提供的通配符上
Route::get('/serviceoperation/{wildcard}', 'PostsController@destroy');
{wildcard}
必须在您的控制器中匹配
public function destroy(ServiceOperation $wildcard) {
//model bind working
}
只要这个名称匹配,只要通配符是 id,模型绑定就会工作
你可以用这个东西解决 -> 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);
}
我正在使用 ajax 对模型的销毁路径进行删除调用。 一切正常,除了控制器与数据库中的相应记录不匹配。
我调用了一个 api/serviceoperations/17
ajax delete 调用,但是如果我以这种方式在我的控制器中放置一个 var_dump
:
public function destroy(ServiceOperation $serviceOperation) {
var_dump($serviceOperation);die;
}
我得到一个不存在的空模型
public 'exists' => boolean false
当然我有一个名为 ServiceOperation 的 model 指的是 table service_operations,使用 主键 id
,在我的数据库中有一条键为 17
.
为什么控制器不解析我的 id 到数据库中相关记录的路由?
更新(已解决):
模型、控制器和迁移是使用命令创建的
php artisan make:model -m -c -r App\Models\ServiceOperation
反正laravel好像不太好把table的名字和一个世界比起来:
虽然上面的命令适用于一个单词 table 名称(即 App\Model\Service),但它不适用于 2 个或更多,因为它不会自行绑定路由中传递的模型。
解决办法是在controller中使用输入变量名全小写
在我的例子中,控制器中的 auto generated destroy 函数是
public function destroy(ServiceOperation $serviceOperation) {
//model bind not working
}
但是模型绑定不起作用。
将参数更新为 小写 字符串,解决问题,模型绑定有效:
public function destroy(ServiceOperation $serviceoperation) {
//model bind working
}
试试这个:
public function destroy(ServiceOperation $serviceOperation, $id) {
$resource = $serviceOperation->find($id);
return $resource->delete();
}
看看,是否有帮助。
解决方法是在controller中输入变量名全部小写
在我的例子中,控制器中的 auto generated destroy 函数是
public function destroy(ServiceOperation $serviceOperation) {
//model bind not working
}
但是模型绑定不起作用。
将参数更新为 小写 字符串,解决问题,模型绑定有效:
public function destroy(ServiceOperation $serviceoperation) {
//model bind working
}
问题出在路由文件中提供的通配符上
Route::get('/serviceoperation/{wildcard}', 'PostsController@destroy');
{wildcard}
必须在您的控制器中匹配
public function destroy(ServiceOperation $wildcard) {
//model bind working
}
只要这个名称匹配,只要通配符是 id,模型绑定就会工作
你可以用这个东西解决 -> 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);
}