【问题标题】:Laravel Query scopes for hotel reservation system with multiple rooms on edit method具有多个房间的酒店预订系统的 Laravel 查询范围编辑方法
【发布时间】:2019-03-15 01:43:28
【问题描述】:

我正在开发一个酒店预订系统,用户/管理员可以选择多个房间进行预订。

我在edit 功能中遇到问题。我正在寻求有关如何解决此问题的帮助和建议。

我的架构。

房间:

room_number
price
reserved (Boolean)
maintenance (Boolean)

预订:

customer_id
checkin
checkout

Reservation_Room

room_id
reservation_id
TotalPrice

房间的查询范围:

public function scopeIsNotReserved($query)
{
    return $query->where('reserved', false);
}

关系预留模型:

public function rooms()
{
    return $this->belongsToMany(Room::class);
}

实际的问题是。

我不能在编辑预订时使用IsNotReserved query scope,因为它不会将值传递给选定的选项。

除了这个reservation_id(见$roomId)之外,我想通过所有没有预订的房间。

我的控制器编辑功能如下所示:

$reservation = Reservation::findOrFail($id);

$customers = Customer::pluck('name', 'id')->toArray();

// 目前没有对这个查询做任何事情。

$roomId = $reservation->rooms()->pluck('rooms.id')->toArray();

获取所有房间

$rooms = Room::IsNotOnMaintenance()->get();

【问题讨论】:

  • 我不明白你想做什么,你能说得清楚一点吗?
  • 我正在传递需要从预订表格中选择的房间。当保存该表单时,三行受到影响或变异。进行预订时,预订的房间更新为 true,预订表与 reservation_room 一起创建。添加新预订时一切正常。现在我想编辑这个预订。仅列出未预订的房间。我想传递所有未保留的房间,除了我选择或过滤的房间,在这种情况下,针对这些 id 的 $roomId = $reservation->rooms()->pluck('rooms.id')->toArray ();
  • 如果我理解正确,您想获得所有未预订的房间,然后过滤掉$roomId 中的那些房间吗?你可以试试这个:Room::IsNotReserved()->except($roomId)
  • #Remul 调用未定义的方法 Illuminate\Database\Eloquent\Builder::except()
  • 抱歉,您必须在集合上使用它:Room::IsNotReserved()->get()->except($roomId); 如果您想在查询生成器上使用它,您可以使用:Room::IsNotReserved()->whereNotIn('id', $roomId)->get();

标签: laravel laravel-5 eloquent query-builder laravel-query-builder


【解决方案1】:

好的,正如我所理解的那样,您想使用范围但传递一个要从查询结果中排除的 id 数组?如果是这样,我将发布该范围的示例:

public function scopeIsNotReserved($query, $exclusions)
{
    return $query->where('reserved', false)->whereNotIn('id', $exclusions);
}

【讨论】:

  • 在将其发布到 stackoverflow 之前,我已经尝试过该方法和其他一些方法。 $roomId = $reservation->rooms()->pluck('rooms.id')->toArray();给出一个包含两项的数组 array:2 [▼ 0 => 7 1 => 10 ] Room::IsNotReserved($roomId)->get();上面的查询范围不知何故无法使用它。
  • 当您说不工作时,您的意思是它会给您带来不好的结果或错误?
  • 它没有给出任何错误。它只是给出房间保留为真的结果,而不给出或显示 $roomId 数组。
  • 你能把你的迁移告诉我们这个reserved字段在哪里
  • 请参考那里的问题。
猜你喜欢
  • 2012-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多