我有一个FrontEndController
可以将所有会议返回到视图中。
class FrontEndController extends Controller
{
public function index(){
return view('home')
->with('conferences', Conference::orderBy('created_at','desc')->take(8)->get());
}
在视图中,我有一个部分,我想列出现有会议的所有城市。例如,如果数据库中有2个会议,并且有一个会议有纽卡斯尔市,而另一个会议有我想在这个列表中显示的纽卡斯尔和利兹。
<ul>
@foreach($conferences as $conf)
<li>
<a class="">{{$conf->city}}</a>
</li>
@endforeach
</ul>
此代码的问题是,例如,如果纽卡斯尔市有5个会议,它出现5次纽卡斯尔,但它应该只出现一次。你知道如何妥善解决这个问题吗?
也许在控制器中我可以有类似的东西:
->with('conferences', Conference::orderBy('created_at','desc')->distinct()->get());
但是可以同时拥有
->with('conferences', Conference::orderBy('created_at','desc')->take(8)->get());
以及
->with('conferences_cities', Conference::orderBy('created_at','desc')->distinct()->get());
有很多查询没有?还是好的?如果有很多像thounsands这样的会议可能会很慢地让所有不同的大会城市像这样。
答案 0 :(得分:2)
如果您只对您所在的城市感兴趣:
->with('cities', Conference::orderBy('created_at','desc')->pluck("city")->unique());
如果您这样做,则需要将前端更改为:
@foreach($cities as $city)
<li>
<a class="">{{$city}}</a>
</li>
@endforeach
或稍微提升性能(可能),您可以委托数据库:
->with('conferences_cities', Conference::select("city")->orderBy('created_at','desc')->distinct()->get());
这不需要更改前端
第三种选择是:
->with('conferences_cities', Conference::orderBy('created_at','desc')->get()->unique('city'));
还有一点需要注意:
长期来看,拥有cities
表可能会更好:
cities ( id, city )
而不是城市,你可以
conference ( ..., city_id )
这意味着您可以直接从城市中选择,而不是通过会议