如何解决Laravel hasMany基于2个条件
我有一个用户模型和一个预订模型。一个用户有很多预订。预订迁移具有以下结构:
但是,添加此关系时,所有保存的预订仅显示给发起该预订的first_user_id
。第二位用户没有预订。
在User.PHP
中,我得到了
public function hasBookings() {
return $this->hasMany('App\Models\Booking','first_user_id','user_auth_id');
}
有没有办法对这种关系进行where子句,以便在'user_auth_id'与first_user_id
或second_user_id
匹配的情况下附加预订?
解决方法
最后,我创建了一个包含预订和用户信息的数据透视表,然后使用该数据透视表在用户模型中设置一个关系:
- 创建一个带有用于预订和用户表的外键的数据透视表:
Schema::create('booking_users_profile',function (Blueprint $table) {
$table->id();
$table->unsignedBigInteger('user_id')->unsigned();
$table->foreign('user_id')->references('user_auth_id')->on('users_profile')->onDelete('cascade');
$table->unsignedBigInteger('booking_id')->unsigned();
$table->foreign('booking_id')->references('id')->on('bookings')->onDelete('cascade');
$table->timestamps();
});
- 然后在用户模型中:
public function bookings() {
return $this->hasMany('App\Models\BookingUsersProfile','user_id','user_auth_id');
}
每当我现在在预订表中创建一个条目时,我都会在数据透视表中创建两个条目,一个用于会话中的每个用户(永远不超过2个)。上面模型中的关系确保用户模型中的预订字段填充有user_id与用户模型ID匹配的那些预订。
foreach ($filteredBookings as $booking) {
$newBooking = new Booking();
$newBooking->start = $booking->startDate;
$newBooking->end = $booking->endDate;
$newBooking->confirmed = "N";
$newBooking->save();
$newPivotBooking = new BookingUsersProfile();
$newPivotBooking->user_id = $userId;
$newPivotBooking->booking_id = $newBooking->id;
$newPivotBooking->save();
$newPivotBooking = new BookingUsersProfile();
$newPivotBooking->user_id = $request->secondUserId;
$newPivotBooking->booking_id = $newBooking->id;
$newPivotBooking->save();
}
这解决了我的问题,并给了我想要的结果:
例如ID = 1的用户的用户模型
"bookings": [
{
"id": 1,"user_id": 1,"booking_id": 6,"created_at": "2020-10-02T11:42:11.000000Z","updated_at": "2020-10-02T11:42:14.000000Z",}]
例如ID = 5的用户的用户模型
"bookings": [
{
"id": 2,"user_id": 5,"created_at": "2020-10-02T11:42:20.000000Z","updated_at": "2020-10-02T11:42:23.000000Z",}]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。