Laravel Eloquent: получение объекта вместо массива - PullRequest
2 голосов
/ 13 марта 2019

Попытка детально получить отель для API управления отелем, в котором для некоторых отелей получается

$ 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 ]

2 голосов
/ 13 марта 2019

Когда вы используете 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 голос
/ 13 марта 2019

После фильтрации массива вы должны переиндексировать ваш массив.

foreach($data->rooms as $key=>$room){

    if(!$room->roomType){
        unset($data->rooms[$key]);
        continue;
    }
}
$data->rooms = $data->rooms->values();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...