php - Laravel 在哪里
问题描述
有什么方法可以返回具有关系的父模型,但只使用 where in 返回一些关系行?
这可能很混乱,让我解释一下。
目前我有 2 个模型,建筑物和房间,1 个建筑物可以有很多房间。
我希望能够传入一组房间 ID,并返回站点,并且只返回数组中的房间。
这是我目前拥有的
if($request->input('ids') && !is_null($request->input('ids'))){
$ids = explode(',',$request->input('ids'));
//Exploded ids looks like this "2,4,11,55,56"
$buildings = Buildings::join('rooms')->whereIn('rooms.id',$ids)->get();
} else {
$buildings = Buildings::whereHas('rooms')->get();
}
目前,这将返回具有 id 在ids
数组中的房间的所有建筑物及其所有房间,最终返回具有 200 多个房间的建筑物。我需要它来返回建筑物,并且只返回在该数组中具有 id 的房间。
这可能吗?
我知道我可以以相反的方式进行操作,并将所有房间作为父级然后获取建筑物,但是我需要建筑物作为父级,因为我正在运行这样的 foreach 并得到结果
foreach($buildings as $key => $building){
<h1>{{$building->name}}</h1>
foreach($building->rooms as $k => $room){
<p>{{$room->name}}</p>
}
}
万一这仍然令人困惑,现实世界的情况是我正在生成房间的 PDF。可以通过勾选房间列表中房间旁边的复选框来选择房间。然后,我需要能够传递房间 ID 数组,并获取包含其中一个房间的所有建筑物。然后获取房间 id 在数组中的每个建筑物的所有房间。
解决方案
首先你需要知道,whereHas
只过滤你的父结果而不是急切的加载关系。因此,您也需要在急切负载中应用该过滤器。像这样
$ids = explode(',',$request->input('ids'));
$buildings = Buildings::with(['rooms' => function($q) use ($ids) {
$q->whereIn('id', $ids);
}])->whereHas('rooms', function($q) use ($ids) {
$q->whereIn('id', $ids);
})->get();
这里whereHas
过滤建筑物和使用with
过滤室。
推荐阅读
- c - C - 访问链表内的链表
- antlr - 有没有办法在 Antlr ParseTree 上编辑节点?
- c - 如何将用户输入与数组进行比较,检查它是否小于最后一个输入
- html - 没有 display:flex 属性,剪辑路径不起作用
- dart - 如何为 CustomClipper 创建的小部件制作合适的边框和阴影
- webpack - 是否可以将 webpack 配置为不添加额外代码?
- java - 更改对象值
- c# - 在 Orderby 中使用 Max()
- java - Android Studio 不建议使用关键字“FirebaseRecyclerAdapter”
- excel - 需要帮助解决不同 Excel 版本上的 Cdbl 函数问题