[英]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的模型,它引用表service_operations ,主鍵為id
,在我的數據庫中有一個鍵為17
的記錄。
為什么控制器不將我的 id 解析為數據庫中相關記錄的路由?
模型、控制器和遷移是使用命令創建的
php artisan make:model -m -c -r App\Models\ServiceOperation
無論如何,laravel 似乎並沒有很好地將表的名稱交給一個世界:
雖然上面的命令適用於一個單詞表名稱(即 App\Model\Service),但它不適用於 2 個或更多,因為它不會自行綁定路由中傳遞的模型。
解決方案是在控制器中使用全小寫字符的輸入變量名稱。
在我的例子中,控制器中自動生成的銷毀函數是
public function destroy(ServiceOperation $serviceOperation) { //model bind not working }
但是模型綁定不起作用。
將參數更新為小寫字符串,解決問題,模型綁定工作:
public function destroy(ServiceOperation $serviceoperation) { //model bind working }
解決方案是在控制器中使用全小寫字符的輸入變量名稱。
在我的例子中,控制器中自動生成的銷毀函數是
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);
}
試試這個:
public function destroy(ServiceOperation $serviceOperation, $id) {
$resource = $serviceOperation->find($id);
return $resource->delete();
}
看看,是否有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.