Eloquent \ model injection into方法返回null

时间:2016-07-27 14:22:58

标签: laravel laravel-5.1 laravel-routing

我在使用注入Eloquent到控制器方法中获取模型时遇到问题 - 它在URL中找不到使用id的模型。 我记得我改变了其他控制器

DB::setFetchMode(PDO::FETCH_ASSOC);

dd($ infrastructure)只返回有关Model的元数据:

Infrastructure {#257 ▼
#table: "infrastructures"
#fillable: array:10 [▶]
#connection: null
#primaryKey: "id"
....
} 

我的控制器方法:

public function show(Infrastructure $infrastructure)
{

    $card = [];
    $card['name'] = $infrastructure->name;
    $card['id'] = $infrastructure->id;
    $card['type'] = "infrastructure";
    $card['items']['manufacturer'] = $infrastructure->manufacturer;
    $card['items']['type'] = $infrastructure->infrastructuretype()->first()-   >name;
    $card['items']['kind'] = $infrastructure->kind()->first()->name;
    $card['items']['serial'] = $infrastructure->serial;
    $card['items']['more info'] = Crypt::decrypt($infrastructure->long_desc);

    $title = 'Infrastructure details ';

    $warranty_left = $infrastructure->warranty_date > $infrastructure->purchase_date ? (new Carbon($infrastructure->warranty_date))->diffInDays(new Carbon($infrastructure->purchase_date)) : 0;

    return view('infrastructure.show', compact('infrastructure', 'card', 'title'));
}

我的路线:

Route::model('infrastructure', 'App\Infrastructure');


Route::group(['middleware' => 'auth'], function () {
Route::resource('infrastructure', 'InfrastructureController');
get('infrastructure/{infrastructure}/logs', [
    'uses' => 'InfrastructureController@showInfrastructureLogs'
]);
resource('infrastructuretype', 'InfrastructureTypeController');


Route::get('auth/logout', 'Auth\AuthController@getLogout');

});

3 个答案:

答案 0 :(得分:1)

我不知道为什么这会停止工作但是会破坏

php artisan route:clear
php artisan route:cache 

的工作。

答案 1 :(得分:0)

在您的路线文件中,将Route::model('infrastructure', 'App\Infrastructure');更改为Route::bind('infrastructure', 'App\Infrastructure');

答案 2 :(得分:0)

您的Route :: resource定义了带有多个名称的通配符,这将构成通配符'基础结构'。

您正在约束'基础设施'模型的通配符,它​​只适用于showInfrastructureLog方法。

您可以在控制台中使用此命令显示每个资源的完整路径:

php artisan route:list

您可以通过更改

轻松解决此问题
Route::model('infrastructure', 'App\Infrastructure');

Route::model('infrastructure', 'App\Infrastructure');

(我从未亲自使用Route :: model进行模型绑定,总是从RouteServiceProvider中做到,但我认为它有效)

同时更改' infrastructure / {infrastructure} / logs'中的通配符。到'基础设施'