从视图到控制器选择值

时间:2018-12-12 19:43:12

标签: php laravel laravel-5 model-view-controller

我正在尝试将下拉列表中的选定值从我的视图传递给控制器​​,以便稍后进行查询。

这是我与选择对象有关的视图

 <Select class="selectsector" id="ColumnType" name="ColumnType">
    <option value=""> Select something </option>
    <option value="">  option 1 </option>
    <option value="">  option 2 </option>
 </select>

然后根据文档和大量答案/示例,我尝试从此行的select中获取值:

 {{ route('trend', ['ColumnType' => $ColumnType->ColumnType])}} 

我的路线:

 Route::get('kitysoftware/ColumnType/{ColumnType}', [
 "uses" => 'SubSectorsBPIsDataController@TrendFilter',
 "as" => 'trend'
  ]);

我的控制器:

  public function TrendFilter($ColumnType)
  {
  $SelectedTrend = DB::table('SubSectorsBPIsData')->select('SectorID', 'ColumnType')->where('ColumnType', $ColumnType)->get();
    echo $selectedTrend; //or whatever else i want to do        
}

错误 我不断得到:未定义的变量:ColumnType(视图:... 我试图更改该行中的几个变量名称:          {{route('trend',['ColumnType'=> $ ColumnType-> ColumnType])}} *它来自那个未定义的变量:$ ColumnType? 我没有重新加载页面,因为我想收集多个下拉列表值,然后进行查询。 不知道我是否采用了正确的方法,也许有更好的方法可以使它起作用。 可能是JavaScript?
预先感谢。

1 个答案:

答案 0 :(得分:0)

要澄清: 您在视图中编写的代码是HTML。如果使用{{...}},则大括号中的代码首先在php中进行评估。所有这些都在您的服务器上发生。发生这种情况时$ColumnType变量不存在(并且以后也不存在)。当您的服务器尝试了解变量的值时,用户甚至没有看到您的站点。

要将数据从用户发送回您的控制器,建议使用以下形式:

<form action="{{route('trend')}}" method="POST">
    <select class="selectsector" id="ColumnType" name="ColumnType">
        <option value=""> Select something </option>
        <option value="option1">option1</option>
        <option value="option2">option2</option>
    </select>
    <input type="submit"></input>
</form>

提交表单后,浏览器将自动将带有参数ColumnType的请求发送回您的控制器。如果要使用POST,请将路由定义更改为Route::post。您可以像这样访问参数的值:

public function TrendFilter(Request $request)
{
    $selectedOption = $request->input('ColumnType');
}

编辑 解决您的评论:

如果采用POST方法,则URL中将不需要{ColumnType}-子路径。所选选项通过请求传递,并且在URL中不可见。

如果要在URL中使用参数(这很有用,如果要通过共享URL来共享站点),请使用GET。然后,您的浏览器会将所选的选项作为参数附加到URL。像这样:

?options=option1

这两种方式都可以像我上面描述的那样在控制器中访问选定的选项。

由于route( name )函数将路由名称作为参数,因此出现“找不到路由”错误。在您的情况下,该值为trend,由路由定义中的“ as”设置。

还请注意,您可能需要在控制器中使用第二个处理程序,以接受表单反馈并进行查询。然后,您可以使用更新后的值(data重定向到上一页(相同视图),并保留所选的选项(withInput())。

public function acceptForm(Request $request){
    $selectedOption = $request->input('ColumnType');
    data = doQuery($selectedOption)...
    return redirect()->back()->with(data)->withInput();
}