如何连接2个表并按照laravel中的父表id对它们进行分组?

时间:2018-04-23 15:06:28

标签: mysql laravel join

我有2张桌子: t1:酒店 t2:人

有5家酒店,每家酒店都有不同的人数。 我想获得分配给该酒店的酒店名称和人名。 通过查询,我可以将酒店名称重复多次,因为其中有人。

$hotels=DB::table('hotels')
->select('hotels.*','people.name')
->leftjoin('people','people.hotel_id','=','hotel.id')
->get();

return view('hotels', ['hotels' => $hotels]);

在我看来,我有

@foreach($hotels as $h)
$h->hotel_name
@endforeach

hotel_name现在显示4次,这与分配给hotel_id的人数相同。 我尝试过使用group_concat但是我只能得到人们的名字。

是否有一组或其他方法可以帮助我实现目标?

5 个答案:

答案 0 :(得分:3)

HotelModel

public function peoples()
{
    return $this->hasMany('App\People','hotel_id');
}

控制器中 (使用 - > with(' peoples')来解决n+1 problem

$hotels = Hotel::with('peoples')->get();    
return view('hotels', ['hotels' => $hotels]);

查看

@foreach($hotels as $h)
    $h->hotel_name

    @foreach($h->peoples as $people)
        $people->name
    @endforeach

@endforeach

答案 1 :(得分:1)

实际上,您可以使用group_concatgroup_by来完成此操作:

select hotels.* ,group_concat(people.name) as people_names
from hotels 
  left join people on hotels.id = people.hotel_id 
group by hotel_name;

使用查询构建器:

$hotels = DB::table('hotels')
   ->select('hotels.*', DB::raw('group_concat(people.name) as people_names'))
   ->leftjoin('people','people.hotel_id','=','hotels.id')
   ->groupBy('hotel_name')
   ->get();

答案 2 :(得分:0)

添加到您的酒店课程

public function peoples()
{
    return $this->hasMany(People::class);
}

在您看来:

@foreach ($hotel->people as $people)
    {{ $people->name }}
@endforeach

答案 3 :(得分:0)

尝试使用Collection的groupBy函数:

$hotels=DB::table('hotels')
->select('hotels.*','people.name')
->leftjoin('people','people.hotel_id','=','hotel.id')
->get();
$grouped = $hotels->groupBy('hotel_name');

return view('hotels', ['hotels' => $grouped]);

然后,像这样打印:

@foreach($hotels as $key => $h)
    Hotel name: {{ $key }}
    @foreach ($h as $p)
        Person name: {{ $p }}
    @endforeach 
@endforeach

答案 4 :(得分:0)

制作酒店模型并定义关系:

public function people()
{
    return $this->hasMany(People::class);
} 

我是你的控制者:

$hotels = Hotel::all():
return view('hotels')->with('hotels', $hotels);

在您看来:

@foreach($hotels as $hotel)

    {{ $hotel->name }}

    @foreach($hotel->people as $person)
        {{ $person->name }}
    @endforeach

@endforeach