как вступить в отношения Laravel - PullRequest
0 голосов
/ 07 октября 2019

Я хочу написать класс сортировки для построителя запросов пространственных данных, но моя проблема в том, что у меня есть 3 модели hotel room и discount, так что теперь в отеле много номеров, и в номерах есть много скидок. Я хочу отсортировать отели посамая низкая скидка, доступная на номера, так что теперь вот запрос, который я пытался заметить, что $query загружает все отели:

$data = $query->with('accommodationRoom')
            ->join('discounts','accommodation_rooms.id','=','discounts.accommodation_room_id')
            ->get();

, но я получаю эту ошибку:

сообщение: "SQLSTATE [42S22]: Столбец не найден: 1054 Неизвестный столбец 'Accommodation_rooms.id' в 'в предложении' (SQL: выбрать * из accommodations внутреннее объединение discounts в accommodation_rooms. id = discounts. accommodation_room_id где существует (выберите * из accommodation_rooms, где accommodations. id = accommodation_rooms. accommodation_id и bed_count = 5)) ",

, потому что егоЯ загружаю отношение в объединение, но оно не распознает поле.

Ответы [ 3 ]

3 голосов
/ 07 октября 2019

Использовать несколько операторов объединения ..

    $data = DB::table('accommodation_rooms')
       ->join('hotels','accommodation_rooms.id','=','hotels.room_id') // replace room_id with your column name
       ->join('discounts','accommodation_rooms.id','=','discounts.accommodation_room_id')
       ->select('accommodation_rooms.*','hotels.*','discounts.*')
       ->get();
2 голосов
/ 07 октября 2019

Добавить отношение в файлах модели.

Модель отеля

Class Hotel{

    public function room()
    {
        return $this->hasMany(Room::class,'hotel_id','id');
    }
}

Модель номера

Class Room{

    public function discount()
    {
        return $this->hasMany(Discount::class,'room_id','id');
    }
}

Запись запроса на выборку

$data = Hotel::with('room', 'room.discount')->orderBy('room.discount.value', 'ASC')->get();

Измените модель и имя поля в приведенном выше коде.

0 голосов
/ 07 октября 2019

Вы также должны присоединиться с помощью accommodationRoom.

Вы даже можете объединить несколько таблиц в одном запросе:

$data = $query->join('accommodation_rooms','hotels.id','=','accommodation_rooms.hotel_id')
    ->join('discounts','accommodation_rooms.id','=','discounts.accommodation_room_id')
    ->select('hotels.*', 'discounts.*')
    ->orderBy('discounts.value')
    ->get();

См. Объединения .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...