如何从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中间接连接的表中检索数据?的主要内容,如果未能解决你的问题,请参考以下文章
从3个表中检索数据如何使用Laravel中的第一个表从最后一个表中检索数据