php - Laravel 5.6 - 如何获取房间交易的最后 X 位客人姓名?
问题描述
我不知道如何为以下场景构建一个有效的 Eloquent 查询。
用户可以住在很多地方,比如房间、公寓、家,所以我们有一个多态stayable_locations
表,但我们只关注stayable_type
这张表的房间。当员工点击一个房间时,我们想要显示所有可用的房间交易(如果有的话room_deals
),以及每个房间交易的最后 3 位客人(如果有)。
尝试通过 eloquent 从下表中获取此输出:
Room 111 (desired output for room deals and guests below)
- Room Deal #1 -> Able, Kane, Eve
- Room Deal #2 -> Eve, Adam
------------------------------------------
$room = Room::where('id',111)->first(); // room 111
// Eloquent query, not sure how to setup model relations correctly
// To get last 3 guest names per room deal [if any] in an efficient query
$room->roomDeals()->withSpecificRoomDealLast3RoomGuestNamesIfAny()->get();
这是表结构:
stayable_locations table [polymorphic]:
id | stayable_id | stayable_type | room_deal_id | room_guest_id
----------------------------------------------------------------
1 | 111 | room | 0 | 3 (Steve no room deal)
2 | 111 | room | 1 | 1 (Adam room deal)
3 | 111 | room | 1 | 2 (Eve room deal)
4 | 111 | room | 1 | 4 (Kane room deal)
5 | 111 | room | 1 | 5 (Able room deal)
6 | 111 | room | 2 | 1 (Adam room deal)
7 | 111 | room | 2 | 2 (Eve room deal)
room_deals table:
id | room_id | room_deal
-----------------------
1 | 111 | Deal A
2 | 111 | Deal B
users table:
id | name
------------
1 | Adam
2 | Eve
3 | Steve
4 | Kane
5 | Able
更新:显示各自的模型
用户模型:
class User extends Authenticatable {
public function stayableLocations() {
return $this->morphMany('App\StayableLocation', 'stayable');
}
}
RoomDeal 型号:
class RoomDeal extends Model {
public function room() {
return $this->belongsTo('App\Room');
}
public function guests() {
return $this->belongsToMany('App\User', 'stayable_locations', 'room_deal_id', 'room_guest_id');
}
}
StayableLocation 模型:
class StayableLocation extends Model {
public function stayable() {
return $this->morphTo();
}
public function room() {
return $this->belongsTo('App\Room', 'stayable_id');
}
}
房间型号:
class Room extends Model {
public function stayableLocations() {
return $this->morphMany('App\StayableLocation', 'stayable');
}
public function roomDeals() {
return $this->hasMany('App\RoomDeal');
}
}
知道如何通过有效的雄辩查询获得所需的输出吗?
解决方案
我从问题中的帮助评论中弄清楚了。开始了:
- Laravel 没有这个开箱即用(见这里)所以我们必须使用第三方包。
- 根据链接说明安装staudenmeir/eloquent-eager-limit软件包并按照使用示例进行操作。
- 这是上面需要改变的[仍然使用上面定义的相同关系
...
],只是添加了use \Staudenmeir\EloquentEagerLimit\HasEagerLimit;
:
class User extends Authenticatable {
use \Staudenmeir\EloquentEagerLimit\HasEagerLimit;
...
}
class RoomDeal extends Model {
use \Staudenmeir\EloquentEagerLimit\HasEagerLimit;
...
}
- 感谢评论者和包帮助,通过 eloquent 使用嵌套限制进行查询:
$room = Room::find(111);
$deals3Guests = $room->roomDeals() // query deals
->with(['guests' => function($query) { // eager load guests
$query->orderBy('stayable_locations.id', 'desc') // get latest guests
->limit(3); // limit to 3
}])
->get();
推荐阅读
- amazon-web-services - ECS 中的 Fargate 任务无法使用 ECR 接口端点从 ECR 存储库中提取映像
- ios - Xamarin iOS - 为什么 Transporter 找不到我的图标?
- selenium - 我需要在离线模式下运行standalone-chrome-debug
- c++ - 使用 CreateProcess() 的唯一配置文件的多个浏览器实例未提供预期输出
- javascript - 意外的令牌,预期的“,”在本机博览会中
- excel - Excel中的高级日期过滤器
- python - Python for / if 构造
- asp.net-core - 创建用户和发布 jwt 令牌的干净方式?
- c# - 如何在控制台应用程序中使用 C# 运行 exe 文件
- javafx - 通过 DRM 在 Gluon JavaFX 16 EA 4 上“getNativeWindowHandle+0x54”