Как получить данные из таблицы, которые косвенно связаны в laravel? - PullRequest
0 голосов
/ 01 августа 2020

Как я могу получить данные о номере при бронировании через таблицу roomAvailabilities ??

Я пробовал использовать:

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

В модели бронирования:

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

Sql Запрос сервера, который может быть похож на то, что я хочу:

SELECT * FROM dbo.Booking as b

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

INNER JOIN dbo.Room как r на 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);
}

Модель доступности номеров

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

1 Ответ

1 голос
/ 01 августа 2020

Похоже, что вам нужна связь ManyToMany (ownToMany), как сказал @ Aless55. Таким образом, ожидается, что бронирование может содержать одну или несколько комнат, в то время как комната может быть (ни одной или) более чем в одном бронировании. другая таблица), вы можете получить доступ к другой модели. Ваш случай будет выглядеть примерно так:

Модель бронирования

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 ( активная загрузка ), например:

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

Посмотрите документацию . Там вы найдете другие возможности, такие как:

  • Настройка имени атрибута сводной таблицы
  • Отношения фильтрации через столбцы промежуточной таблицы
  • Определение пользовательских моделей промежуточных таблиц
...