![](/img/trans.png)
[英]Property [X] does not exist on this collection instance laravel relationship
[英]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.