如何在下拉菜单顶部移动 3 个热门国家 选项 1:收藏夹选项 2:订购

问题描述

我目前有一个国家 dropdown 菜单,可显示所有国家/地区。通常,我的用户会在“美国”、“英国”或“加拿大”之间进行选择。我不希望我的用户一直向下滚动到列表以选择他们的国家/地区,那么有没有办法让这 3 个国家/地区位于列表顶部?

enter image description here

正如你从图片中看到的那样,这是我想要的。当然,现在我对这 3 个国家/地区进行了硬编码。我觉得硬编码不是一个好习惯,特别是因为我已经在列表中列出了这 3 个国家,所以没有必要对其进行硬编码。

如您所见,这是我显示国家/地区的代码。您还可以看到我对 3 个国家/地区进行了硬编码。下面是我添加代码,以便您可以看到。

<select name="country" id="country" class="custom-select" data-live-search="true" data-default="{{ old('country') }}">
    <option value="">Select Country</option>
    <option value="US">United States</option>
    <option value="GB">United Kingdom</option>
    <option value="CA">Canada</option>
    @foreach ($countries as $key=>$val)
        @if($key == old('country'))
            <option value="{{ $key }}" selected="selected">{{ $val }}</option>
        @else
            <option value="{{ $key }}">{{ $val }}</option>
        @endif
    @endforeach
</select>

感谢您对此的任何帮助!谢谢!

解决方法

在您的国家/地区表中添加一列,您可以在其中区分正常国家/地区和热门国家/地区。

选项 1:收藏夹

favorite 列附加到您的表中,作为 TINYINT(迁移中的 boolean)。然后,只需为这 3 个国家/地区将其设置为 1 (true),然后您可以将 orderBy 附加到您的查询中: $query->orderByDesc('favorite')

这将返回顶部的 3 个最喜欢的国家

选项 2:订购

我更喜欢这种方法,因为它绝对更具可配置性。将 order 列附加到您的表中,作为未签名的 INT(迁移中的 unsignedInteger)。然后,将订单值设置为 0 或 1(我个人更喜欢 1,因为它更具人类可读性,但您在更改/更新订单时必须牢记这一点)到您拥有的国家/地区(-1,如果您开始在 0),按照您希望它们的显示方式。然后,在您的查询中:$query->orderBy('order')。您甚至可以将其添加为 global scope 以永远不会忘记订购。这样,您可以随时说您希望英国高于美国,反之亦然,或者如果您意识到一个国家比另一个国家更受欢迎,则可以更改它。

,

您不需要添加额外的列或表。您可以使用 arrays 选项作为解决方案。使用以下条件分别制作两个数组。然后使用 ->toArray() 将查询输出转换为数组。最后使用 array_merge() 合并两个数组并传递给视图。我想你用 idcountry_name 字段制作了一个国家列表,如下所示:

控制器

$my_countries = \App\Country::select(['id','country_name'])->where('country_name','United States')->orWhere('country_name','United Kingdom')->orWhere('country_name','Canada')->get()->toArray();
$countries = \App\Country::select(['id','country_name'])->whereNotIn('country_name',['United States','United Kingdom','Canada'])->get()->toArray();
$all_countries  = array_merge($my_countries,$countries);   
return view('your_view',['all_countries' => $all_countries]);  

查看

<select name="country">
    @foreach($all_countries as $country )
        <option value="{{ $country['id'] }}">{{ $country['country_name'] }}</option>
    @endforeach
</select>