【问题标题】:Laravel 5.6 - How to fetch last X guest names for room deal?Laravel 5.6 - 如何获取房间交易的最后 X 位客人姓名?
【发布时间】:2019-03-07 20:01:49
【问题描述】:

我不知道如何为以下场景构建一个高效的 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');
  }
}

知道如何通过有效的 eloquent 查询获得所需的输出吗?

【问题讨论】:

  • 我删除了我的答案,原来 Eloquent 不支持这种类型的查询。如果您检查此拉取请求解决的问题,您可以尝试其他一些解决方案:github.com/laravel/docs/pull/4918。祝你好运!
  • @jonasstaudenmeir 我注意到你的包在这里 (github.com/staudenmeir/eloquent-eager-limit) 但安装它后,我不确定如何正确应用模型关系以获得雄辩的渴望有限结果的所需输出(因为多态关系在这里使用,它使它更具挑战性)。有什么想法吗?
  • 您是否尝试过将 newUserName02 的已删除答案(您在某处还有吗?)与包结合使用? “最后”是如何确定的?
  • 谢谢你们!用下面的解决方案想通了。感谢 newUserName02 和包@JonasStaudenmeir 的指导!

标签: php laravel eloquent laravel-5.5 laravel-5.6


【解决方案1】:

我从问题中的帮助 cmets 中弄清楚了。我们开始:

  1. Laravel 没有开箱即用的 (see here),所以我们必须使用第三方包。
  2. 按照链接说明安装staudenmeir/eloquent-eager-limit 包并按照使用示例进行操作。
  3. 这是上面需要更改的内容[仍然使用上面定义的相同关系用于下面的...],只是添加了use \Staudenmeir\EloquentEagerLimit\HasEagerLimit;
class User extends Authenticatable {
  use \Staudenmeir\EloquentEagerLimit\HasEagerLimit;
  ... 
}

class RoomDeal extends Model {
  use \Staudenmeir\EloquentEagerLimit\HasEagerLimit;
  ...
}
  1. 感谢评论者和软件包的帮助,通过 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();

【讨论】:

    猜你喜欢
    • 2021-12-26
    • 2011-06-16
    • 1970-01-01
    • 2021-09-19
    • 2021-08-18
    • 1970-01-01
    • 2020-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多