在我的Laravel项目中,我通过路由器发送一个ID:
Route::get('dashboards/{dashboard}', 'DashboardController@show');
在这种情况下,ID为1
。
在我的控制器中,此查询:
public function show(Dashboard $dashboard)
{
$dash = Dashboard::find($dashboard);
return $dash;
}
返回ID为1
的仪表板。但是当我使用此查询时,它什么也没显示:
public function show(Dashboard $dashboard)
{
$dash = DB::table('dashboards')->where('dashboardId', '=', $dashboard)->get();
return $dash;
}
虽然使用相同的代码,但是将$dashboard
替换为1
,但它向我显示了所有具有相同ID的仪表板:
public function show(Dashboard $dashboard)
{
$dash = DB::table('dashboards')->where('dashboardId', '=', 1)->get();
return $dash;
}
有人可以向我解释为什么这行不通吗?该查询对我来说似乎是正确的。
答案 0 :(得分:3)
可以有2种选择: 第一个,如果要使用仪表板对象
public function show(Dashboard $dashboard){
$dash = DB::table('dashboards')->where('dashboardId', '=', $dashboard->id)->get();
return $dash;
}
或者第二个,您可以通过传递$ id(在您的情况下为$ dashboard)来提供id的引用
public function show($dashboard){
$dash = DB::table('dashboards')->where('dashboardId', '=', $dashboard)->get();
return $dash;
}
如果您要通过url传递ID,请使用上面提到的第二种替代方法。
答案 1 :(得分:2)
(不知不觉中)您正在使用Route Model Binding
来接受仪表板ID。
https://laravel.com/docs/5.7/routing#route-model-binding
这将转换您传递的id并为您获取模型。
由于您拥有show(Dashboard $dashboard)
,因此在转到Dashboard
时将获得ID为1的/dashboards/1
模型
这意味着您不需要此行:
$dash = DB::table('dashboards')->where('dashboardId', '=', $dashboard)->get();
因为在功能参数中接受的$dashboard
已经是ID为1的Dashboard
。
-
如果要手动获取仪表板,请将功能参数更改为show($dashboardId)
然后您可以执行以下操作:
$dash = DB::table('dashboards')->where('dashboardId', $dashboardId)->first();
-
如果您可以访问的话,这里有一个关于路由模型绑定的非常棒的Laracasts视频:
https://laracasts.com/series/laravel-from-scratch-2017/episodes/9
答案 2 :(得分:2)
如果您使用Dashboard $dashboard
public function show(Dashboard $dashboard)
{
return $dashboard;
}
如果您想使用雄辩的话
public function show($dashboard)
{
$dash = DB::table('dashboards')->where('dashboardId', '=', $dashboard)->get();
return $dash;
}
文档:https://jenssegers.com/52/laravel-route-model-binding-is-awesome
答案 3 :(得分:-3)
我认为您应该在查询中传递 $ dashboard-> id
$dash = DB::table('dashboards')->where('dashboardId', '=', $dashboard->id)->get();