【问题标题】:How to retrieve the data from table that are indirectly connected in laravel?如何从laravel中间接连接的表中检索数据?
【发布时间】:2020-11-22 01:18:59
【问题描述】:

如何通过 roomAvailabilities 表从预订中获取房间数据?

我尝试使用:

    $booking = Booking::all();
    $booking-> RoomAvailability;   //it works
    $booking -> Room;              //doesnot work

在预订模式中:

public function room()
{
    return $this->hasManyThrough('App\Room', 'App\RoomAvailability');
}

可能与我想要的类似的 SQL Server 查询:

SELECT * FROM dbo.Booking as b

inner JOIN dbo.RoomAvailability as ra on b.bookingId = ra.BookingId

inner JOIN dbo.Room as r on r.roomId = ra.roomId

下面是我的表结构示例。

预订:

id 
check_in_date
check_out_date
number_of_rooms

房间可用性:

id 
booking_id
room_id
status

房间:

id
room_number

预订模式

public function roomAvailability()
{
    return $this->hasMany(RoomAvailability::class);
}

RoomAvailability 模型

public function booking()
{
    return $this->belongsTo(Booking::class);
}

【问题讨论】:

标签: laravel laravel-5 eloquent laravel-4


【解决方案1】:

正如@Aless55 所说,您似乎需要一个多对多(belongsToMany)关系。因此,预计一个预订可以包含一个或多个房间,而一个房间可以包含(无或)多个预订。

当通过调用 belongsToMany 方法定义函数时(以及另一个表中的逆方法),您可以访问另一个模型。您的案例看起来像这样:

预订模式

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

房间模型

public function bookings()
{
    return $this->belongsToMany(Booking::class, 'RoomAvailabilities');
}

Eloquent 将按字母顺序连接两个相关模型名称以获取数据透视表。请注意,在您的情况下,需要使用第二个参数(可选),因为该表的命名法 (RoomAvailabilities) 超出了 Eloquent 的预期标准。


有一种方便的方法可以访问链接表属性。只需访问生成的名为 pivot 的属性。示例:

$booking = Booking::find(1);

foreach ($booking->rooms as $room) {
    echo $room->pivot->status;
}

要获得多个相关房间的预订,请使用 with 方法 (eager loading),如下所示:

$bookings = Booking::with('rooms')->get();

看看documentation。在那里您会发现其他可能性,例如:

  • 自定义枢轴属性名称
  • 通过中间表列过滤关系
  • 定义自定义中间表模型

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-23
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多