Как получить только отдельные города в списке? - PullRequest
0 голосов
/ 15 мая 2018

У меня есть 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 голосов
/ 15 мая 2018

Если вас интересуют только города, вы можете сделать:

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

Это означает, что вы можете просто выбирать города напрямую, а не проводить конференции

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...