Поиск общего значения Laravel

188
21 августа 2021, 16:50

Есть таблица.
id city_id region_id
1 2 3
2 3 3
3 1 3
4 5 2
5 5 2

В функцию приходят city_id 2 и 3
Как быстро определить есть ли у них общий регион?
В другой ситуации если прийдет city_id 2 и 5 например, то мне нужно будет проверить если у них общий регион, если нет, то создать новую запись с другим регион_айди.
Пока максимум чего получилось добиться этого

function check(int $first_city, int $second_city)
{
 $first_city_arr = Table::where('city_id', $first_city)->get();
 foreach($first_city_arr as $first){
  $check_region = Table::where('city_id', $second_city)->where('region_id', $first->region_id)->first();
  if($check_region){
   return 'error';
  }
 }
}
Answer 1

Если не хотите сильно нагружать бд, то можете попробовать сделать так. Получаем коллекцию городов, и сразу подключаем к ним регионы (внутри используется load, то есть всё в едином запросе к бд). Далее работаем только с коллекцией. Получаем регион для поиска и проверяем есть ли он в коллекции второго города! (Ну раз у Вас есть такая таблица которую Вы предоставили, то связь многие ко многим надеюсь у Вас настроена!) Код похож на Ваш, но с использование коллекций, а не запросов к базе данных.

$cities= Cities::find([$first_city, $second_city])->fresh('regions');
foreach ($cities[0]->regions as $key => $value) {
    if (count($cities[1]->regions ->whereIn('id', $value->id))) {
        return true;
    }
}
return false;

Второй пример использование связующей таблицы как исходную. Работа то же через коллекцию:

$table= DB::table('city_region')
        ->select()
        ->whereIn('city_id', [$first_city, $second_city])
        ->get()
        ->groupBy('city_id');
foreach ($table[$first_city] as $key => $value) {
    if (count($table[$second_city]->whereIn('region_id', $value->region_id))) return true;
}
return false;
READ ALSO
Laravel api в респонсе отдать код без тела

Laravel api в респонсе отдать код без тела

Есть laravel, debugbarРоут прописанный в Api

105
No such file or directory failed to open stream

No such file or directory failed to open stream

Не удается задать правильный путь к файлу file(/home/c/cd09875/lenia/public_html/site/sentences/feasibletxt): failed to open stream: No such file or directory in /home/c/cd09875/lenia/public_html/site/main_page

172
Возврат значения из php с помощью ajax

Возврат значения из php с помощью ajax

В файле indexphp считываю значения с полей input summa_1 и summa_2, с помощью скрипта calc

92
Как Symfony узнает, какой ObjectManager нужно создать

Как Symfony узнает, какой ObjectManager нужно создать

Вопрос возможно странный, но все жеИмеем конфиг из документации Symfony 4:

142