Laravel Eloquent:获取对象而不是数组

时间:2019-03-13 13:40:49

标签: laravel laravel-5 eloquent

尝试通过酒店管理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":[
        {},
        {},
    ]       
}

2 个答案:

答案 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;

或者将foreachfilter结合使用,而不是values()循环:

$filteredRooms = $data->rooms->filter(function ($room, $key) {
    return (!$room->roomType)? false : true;
})->values();

答案 1 :(得分:1)

过滤数组后,您必须重新索引数组。

onAction