Свойство [x] не существует в этом экземпляре коллекции - PullRequest
0 голосов
/ 12 мая 2019

Я испытываю эту проблему, когда запрашиваю базу данных, используя набор условий. если условия найдены в базе данных, отображаются результаты, но если они не найдены, выдается ошибка:

Свойство [room_no] не существует в этом экземпляре коллекции.

Я пытаюсь сделать запрос в моем отеле базы данных, где номер комнаты свободен, а тип комнаты соответствует указанному пользователем. Я пытался найти похожие проблемы на этой платформе, но, похоже, они не соответствуют моей проблемной области.

Я пытался использовать get(), first(), но не решает мою проблему.

Моя функция проверки доступных номеров:

public function availablerooms(Request $request)
{
    try {
            $customers = Customer::All();
            $room_type = $request->input('room_type');
            $room = Room
                        ::All()
                        ->where('room_status', 'Vacant')
                        ->where('room_type', $room_type);

            return view('admin.availablerooms')
                       ->with('room', $room)
                       ->with('customers', $customers);
    }
    catch (\Illuminate\Database\Eloquent\ModelNotFoundException $e)
    {
          //    
    }

}

мой код для отображения данных:

@if(count($room) > 0)
        @foreach($room->all() as$room)

            <tr>
                <td>{{$room->id}}</td><td>{{$room->room_no}}</td><td>{{$room->room_type}}</td><td>{{$room->room_status}}</td>
                <td>
                    <div class="dropdown">
                        <button  type="button" onclick="set()" class="btn btn-success" data-toggle="modal" data-target="#myModal" >
                            Checkin
                        </button>

                    </div>
                </td>
            </tr>

        @endforeach
        @else
        <div>
            <p class="text-warning"> No records found with that criteria </p>
        </div>
    @endif

    </tbody>

Я ожидаю, что если найдены записи, он отображает (что он делает), если не найден, он не показывает доступных записей.

Ответы [ 2 ]

0 голосов
/ 12 мая 2019

Обратите внимание на это предложение:

$rooms = Room
    ::All() // <---
    ->where('room_status', 'Vacant')
    ->where('room_type', $room_type);

Когда вы выполняете метод all(), вы извлекаете все записи в вашей таблице rooms (поэтому вы выполняете запрос там). В основном это запрос select *, поэтому на этом этапе вы получаете набор элементов, соответствующих этому условию (это: набор всех Room объектов).

Что следует из вашего кода, так это то, что вы ограничиваете результаты методом where(), но обратите внимание, что, учитывая, что у вас уже есть экземпляр коллекции returnetd, это ограничение выполняется в collection уровень, а не на уровне база данных * уровень 1016 *.

Что происходит, когда вы выполняете предложения where() и в коллекции нет объекта, соответствующего условию? Он вернет коллекцию empty. Это:

=> Illuminate\Database\Eloquent\Collection {#3444
     all: [],
   }

Таким образом, это означает, что оно никогда не сгенерирует исключение, указанное вами в предложении try-catch (ModelNotFoundException), даже если модель не найдена. Итак, когда вы вернете свои результаты в ваше представление.

Как ее решить: Хорошо, вы можете выполнить запрос после того, как вы укажете предложения where, чтобы они выполнялись на уровне базы данных, а затем выдавали ошибку. Другой вариант - использовать существующую настройку, а затем подсчитать возвращаемую коллекцию и вручную выдать исключение. Я дам вам ответ по первому варианту:

$rooms = Room
    ::where('room_status', 'Vacant')
    ->where('room_type', $room_type);
    ->get();   // <---- here we execute the query.

Так как вы могли бы выдать ошибку, если модель не найдена?

if( ! $rooms->count())
{
    throw new ModelNotFoundException();
}

Для второго варианта просто:

if( ! $rooms->count())
{
    throw new ModelNotFoundException();
}
0 голосов
/ 12 мая 2019

Проблема в том, что вы используете псевдоним текущего элемента в цикле foreach как $room, который совпадает с именем вашей коллекции.

В вашем контроллере вы должны изменить имя переменной $room на$rooms.

$rooms = Room::where('room_status', 'Vacant')
    ->where('room_type', $room_type)
    ->get();

return view(...)->with('rooms', $rooms);

Теперь, на ваш взгляд, вы можете сделать следующее:

@foreach($rooms as $room)
    <tr>
        <td>{{ $room->id }}</td>
        <td>{{ $room->room_no }}</td>
        <td>{{ $room->room_type }}</td>
        <td>{{ $room->room_status }}</td>
        <td>
            <div class="dropdown">
                <button type="button" onclick="set()" class="btn btn-success" data-toggle="modal" data-target="#myModal">
                    Checkin
                </button>
            </div>
        </td>
    </tr>
@endforeach
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...