如何从laravel中间接连接的表中检索数据?

Posted

技术标签:

【中文标题】如何从laravel中间接连接的表中检索数据?【英文标题】:How to retrieve the data from table that are indirectly connected in 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.com/docs/7.x/eloquent-relationships#many-to-many 你试过这样做吗 感谢您帮助@Aless55 :) ... 【参考方案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。在那里您会发现其他可能性,例如:

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

【讨论】:

以上是关于如何从laravel中间接连接的表中检索数据?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel:通过另一个表从具有关联表的表中检索记录

通过内连接从不同的表中检索值

从3个表中检索数据如何使用Laravel中的第一个表从最后一个表中检索数据

SQL如何从每个连接表中检索最新结果

如何从 laravel 框架中的模型中的表中获取数据并直接在视图中使用?

如何从另一个表中检索并再次将其输入到 laravel 中的另一个表中?