该集合实例上不存在属性[x]

时间:2019-05-12 13:52:52

标签: php laravel laravel-5 eloquent

当我使用一组条件查询数据库时遇到此问题。如果在数据库中找到了条件,则显示结果,但如果找不到,则会引发错误:

  

此集合实例上不存在属性[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 :(得分:0)

问题在于,您在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

答案 1 :(得分:0)

请注意以下句子:

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

当执行all()方法时,您正在检索rooms表上的所有记录(因此您要在此处执行查询)。基本上是一个select *查询,因此在这一点上,您将检索符合此条件的元素集合(这是:{strong> all Room个对象的集合)。

-正如您的代码所建议的-接下来是,您正在使用where()方法约束结果,但是请注意,鉴于您已经有一个returnetd的集合实例,此约束是在集合中完成的级别,而不是数据库级别。

当您执行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();
}