繁体   English   中英

此集合实例上不存在Property [x]

[英]Property [x] does not exist on this collection instance

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

此集合实例上不存在属性[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>

我希望如果找到记录它会显示(它确实如此),如果没有找到,则显示没有可用的记录。

问题是您将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

注意这句话:

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

当您执行all()方法时,您正在检索rooms表上的所有记录(因此您在那里执行查询)。 基本上是一个select *查询,所以此时你检索一个符合这个条件的元素集合(这是: 所有 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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM