如何在 laravel 5.2 中重新加载页面后保留 select2 值?

Posted

技术标签:

【中文标题】如何在 laravel 5.2 中重新加载页面后保留 select2 值?【英文标题】:How to preserve select2 values after page reload in laravel 5.2? 【发布时间】:2021-04-05 14:36:55 【问题描述】:

在基于 laravel 5.2 的 MVC 项目中,为了在 select2 下拉选择中保留值(不是键),我们在查找 SSP 术语时触发此控制器:

public function get_ssp(Request $request) 
    $term = $request->get('term');

    $ssp_list = SspCompanyList::where('ssp_company_name', 'LIKE', '%'. $term['term'] .'%')
        ->get(['ssp_company_id as id', 'ssp_company_name as text']);

    return ['results' => $ssp_list];


然后我们在提交并重新加载具有渲染表的同一页面后,在控制器中处理选择的 id。我们必须将值保留在上面的内联形式中。 Select2 在“multiple”模式下是这样配置的:

    $(document).ready(function() 
        $('#ssp').select2(
            width: '200px',
            minimumInputLength: 3,
            ajax: 
                url: ' route("get_ssp") ',
                dataType: 'json',
                type: "POST",
                quietMillis: 50,
                data: function (term) 
                    return 
                        term: term
                    ;
                ,
            ,
        );
    );

但问题是 select2 仅发送 ssp_id[] 中的 id,而不发送键值项,并且在发送之前无法将它们从 old() 函数中恢复为项名称。

所以,我试图以这种方式解决它,通过在刀片视图中调用模型并通过其 id 选择 ssp 名称:

     <form class="form-inline" method="POST" action="route('ssp.report')">
        ...
        <select name="ssp_id[]" id="ssp" class="form-control-lg select2" multiple="multiple">
            @if (is_array(old('ssp_id')))
                @foreach (old('ssp_id') as $ssp_id)
                     $ssp_name = \App\Models\SspCompanyList::select('ssp_company_name')->where('ssp_company_id', $ssp_id)->first()->ssp_company_name 
                    <option value=" $ssp_name " selected="selected"> $ssp_name </option>
                @endforeach
            @endif
        </select>
     ...
     </form>

在第一次重新加载后它实际上可以工作并保留在第一页重新加载之前选择的所有 ssp 名称,但是在第二次尝试在同一页面上为下面的 ssp 选择值并提交表单后,laravel 返回此错误:

试图获取非对象的属性“ssp_company_name”(查看: /home/pavel/projects/dsp/resources/views/dsp/index.blade.php)

那么,为什么第一次有效而第二次无效?对于select2,我们是否应该以其他方式处理它并通过js添加这些旧值,也许?

【问题讨论】:

【参考方案1】:

其实问题出在以下几点:

之前:

            <option value=" $ssp_name " selected="selected"> $ssp_name </option>

之后:

            <option value=" $ssp_id " selected="selected"> $ssp_name </option>

【讨论】:

以上是关于如何在 laravel 5.2 中重新加载页面后保留 select2 值?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Ajax 加载过滤后的数据,而无需在 laravel 中重新加载整个页面

Laravel 使用 QueryBuilder 时如何避免页面重新加载

如何修复页面重新加载相同的表单提交与laravel

错误:自动覆盖加载(引导程序)(laravel 5.2)

Laravel - 创建一个会话数组并在每次重新加载页面时添加到它

如何将客人重定向到登录页面,在laravel 5.2登录后重定向回来[关闭]