问题描述
我目前有一个国家 dropdown
菜单,可显示所有国家/地区。通常,我的用户会在“美国”、“英国”或“加拿大”之间进行选择。我不希望我的用户一直向下滚动到列表以选择他们的国家/地区,那么有没有办法让这 3 个国家/地区位于列表顶部?
正如你从图片中看到的那样,这是我想要的。当然,现在我对这 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()
合并两个数组并传递给视图。我想你用 id
和 country_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>