尝试通过酒店管理API详细了解酒店,其中某些酒店会获得
$ hotel->房间
作为对象,某些作为数组。在Hotel模型中雄辩的查询如下。
public function detail($hotelid) {
return $this->with(['rooms','roomType'])->find($hotelid);
}
public function rooms() {
return $this->hasMany(HotelRooms::class, 'hotels_id')->where('status','active');
}
HotelRoom模型
public function roomType(){
return $this->hasOne(RoomType::class,'id','room_type_id')->where('status','active');
}
控制器
public function __construct(){
$this->model = new Hotel();
}
public function hotelDetail(Request $request){
$data = $this->model->detail($request->input('hotel_id'));
foreach($data->rooms as $key=>$room){
if(!$room->roomType){
unset($data->rooms[$key]);
continue;
}
}
return response()->json([
'status' => true,
'status_message' => 'successful',
'data' => $data,
]);
}
响应
{
"id":"id",
"name":"name",
"rooms":{
"1":{},
"2":{}
}
}
{
"id":"id",
"name":"name",
"rooms":[
{},
{},
]
}
答案 0 :(得分:2)
在数组上使用unset
时,将保留每个项目的数组索引。与collection->filter()
或array_filter()
中实际使用的collection->filter()
相同。这就是为什么您需要重建索引的原因:
$data->rooms = array_values($data->rooms->toArray());
为数组重新索引。
或使用foreach
,但将值推入新数组:
$filteredRooms = [];
foreach($data->rooms as $key=>$room){
if(!$room->roomType){
continue;
}
$filteredRooms[] = $room;
}
$data->rooms = $filteredRooms;
或者将foreach
与filter
结合使用,而不是values()
循环:
$filteredRooms = $data->rooms->filter(function ($room, $key) {
return (!$room->roomType)? false : true;
})->values();
答案 1 :(得分:1)
过滤数组后,您必须重新索引数组。
onAction