Laravel雄辩的``哪里''查询不适用于给定的ID

时间:2018-10-24 08:52:48

标签: php laravel

在我的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;
}

有人可以向我解释为什么这行不通吗?该查询对我来说似乎是正确的。

4 个答案:

答案 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();