Laravel Query Builder groupBy в сочетании с отношениями - PullRequest
3 голосов
/ 09 ноября 2019

Рассмотрим эти 2 простые таблицы с отношением «один ко многим»:

автомобили

  • id
  • бренд
  • user_id

пользователи

  • id
  • имя пользователя

Пользователи могут иметь несколькоавтомобили, каждый автомобиль принадлежит одному пользователю.

Для каждой марки автомобиля я хотел бы знать имя пользователя, которому принадлежит большинство из них + сумма.

Возможно ли это с одним запросом SQL? Я ищу самый элегантный способ сделать это с помощью Laravel Query Builder?

DB::table('cars')->groupBy('brand');

Это то, что у меня есть до сих пор ...

Спасибо!

Ответы [ 2 ]

0 голосов
/ 09 ноября 2019

Попробуйте

   Car::join('users', 'users.id', '=', 'cars.userid')
    ->groupBy('cars.brand','users.username')
    ->selectRaw('users.id, users.username, cars.brand,COUNT(cars.brand) AS amount')
    ->get();
0 голосов
/ 09 ноября 2019

Надеюсь, это поможет.

$sub = DB::table('cars')
->join('users', 'users.id', '=', 'cars.user_id')
->groupBy('cars.brand', 'users.id', 'users.username')
->selectRaw('users.id, 
             users.username, 
             cars.brand, 
             COUNT(cars.rand) AS brand_amount');

$count = DB::table( DB::raw("({$sub->toSql()}) as sub") )
    ->mergeBindings($sub->getQuery())
    ->groupBy('brand')
    ->select('brand', 'username', DB::Raw('MAX(brand_amount) AS amount'))
    ->get();
...