当我使用一组条件查询数据库时遇到此问题。如果在数据库中找到了条件,则显示结果,但如果找不到,则会引发错误:
此集合实例上不存在属性[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>
我希望,如果找到记录,它会显示(确实如此),如果找不到,它会显示没有可用的记录。
答案 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();
}