Как сгруппировать и посчитать сводную таблицу в laravel? - PullRequest
0 голосов
/ 22 октября 2019

У меня есть три таблицы,

     User                   cities             user_cities

id  name    title           id   name        user_id   city_id
1    aaa   designer         1   cityA          2         1
2    bbb   developer        2   cityB          2         2
3    ccc   designer         3   cityC          1         2
                                               1         1
                                               2         3
                                               3         2

После объединения и запроса к базе данных мой результат:

data: {
   0: {
      id: 1
      name: aaa,
      title: designer,
      cities :[
         0: {
            id: 1,
            name: cityA
          }
          1: {
            id: 2,
            name: cityB
          }
          2: {
            id: 3,
            name: cityC
          }
        ]
    },
    1: {
      id: 2
      name: bbb,
      title: developer,
      cities :[
         0: {
            id: 1,
            name: cityA
          }
          1: {
            id: 2,
            name: cityB
          }
        ]
    }
    1: {
      id: 3
      name: ccc,
      title: designer,
      cities :[
          0: {
            id: 2,
            name: cityB
          }
        ]
    }
}

Пока все хорошо. Но я хочу groupBy по городам и считать.

Если я отфильтрую по title=designer, отобразятся отфильтрованные данные, и я хочу создать группу по городам и подсчитать ее.

Таким образом, мой окончательный результат будет

cityA = 1 counts
cityC = 2 counts

Помогите мне решить проблему.

1 Ответ

0 голосов
/ 22 октября 2019

Вы можете использовать withCount для быстрой загрузки счетчиков отношений.

Я предполагаю, что у вас уже есть отношения городов, определенные в модели User.php:

class User
{
    public function cities()
    {
        return $this->belongsToMany(City::class);
    }
}

Тогда:

$users = User::withCount('cities')->get();

Я думаю, что результаты будут:

data: {
   0: {
      id: 1
      name: aaa,
      title: designer,
      cities_count: 3
    },
    1: {
      id: 2
      name: bbb,
      title: developer,
    cities_count: 2

    }
    1: {
      id: 3
      name: ccc,
      title: designer,
      cities_count: 1
    }
}

Альтернативой может быть использование отложенной загрузки:

$users = User::all()->loadCount('cities');
...