如何只获取列表中的不同城市?

时间:2018-05-15 14:01:36

标签: php laravel

我有一个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这样的会议可能会很慢地让所有不同的大会城市像这样。

1 个答案:

答案 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 ) 

这意味着您可以直接从城市中选择,而不是通过会议