У меня есть 4 таблицы:
- объявления (id, name, type_id, city_id)
- типы (id, slug, name)
- города (id , slug, name) (37000 записей)
- состояния (id, slug, name) (120 записей)
У меня может быть URL-адрес, подобный этому: https://example.com/ad , тип, город. html или так: https://example.com/ad, тип, штат. html
Мне нужно сделать фильтр поисковой рекламы по слагам и я Я делаю вот так, чтобы мои объявления фильтровались:
$slugs = explode(',', $slugs);
$ads = Ad::where('is_active', true)->get();
foreach ($slug as slug){
$types = Type::all();
if ($types->contains('slug', $slug)) {
$type = $types->first(function ($value) use ($slug) {
return $value->slug == $slug;
});
$ads = $ads->where('type_id', $type->id);
$cities = City::all();
if ($cities->contains('slug', $slug)) {
$city = $cities->first(function ($value) use ($slug) {
return $city->slug == $slug;
});
$ads = $ads->where('city_id', $city->id);
$states = State::all();
if ($states->contains('slug', $slug)) {
$state = $states->first(function ($value) use ($slug) {
return $state->slug == $slug;
});
$ads = $ads->where('state_id', $state->id);
}
return $ads;
}
Это работает. Но так как у меня много городов, это может быть медленным (от 1 до 2 секунд). Как я могу это улучшить? Я думал использовать кеш, например memcached, чтобы разместить на нем города, но результат не так сильно изменился. Может так я его построил кто не прав?