我有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但是我只能得到人们的名字。
是否有一组或其他方法可以帮助我实现目标?
答案 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_concat
和group_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