Laravel Eloquent查询预订

时间:2018-05-28 13:56:32

标签: mysql laravel eloquent

我正在使用Laravel为酒店建立预订应用程序。

使用的数据库是MySQL。所有客房均配有桌子,还设有带预留客房的桌子。 ReservedRooms有一个到Rooms(room_id)的外键。

要获得某个时间间隔内的可用房间,我会使用2个查询:

  1. 首先,我得到所有未预留的房间。

    $room = App\Room::whereNotIn('id',App\ReservedRoom::select('camera_id'))->get();
    
  2. 然后,如果预订室的入住/退房时间低于我的入住日期或高于我的结账日期,我会检查ReservedRooms表。

    $room2 = App\ReservedRoom::select('camera_id')->where([['checkin','<','mycheckin'],['checkout','<','mycheckin']])->orWhere([['checkin','>','mycheckout'],['checkout','>','mycheckout']]); 
    
  3. 在这两个查询之后,我合并了结果:

    $result=$room->merge($room2);  
    

    问题是当房间被预订两次时,如果其中一个日期可用,而另一个日期不可用,则其中一个日期将通过条件,房间将显示在结果中。

1 个答案:

答案 0 :(得分:0)

我会尝试将结果放在一个查询中(根据Laravel docs Parameter grouping):

import { Component, Inject } from '@angular/core';
import { Router } from '@angular/router';
import { UsuariosService } from '../../services/usuarios.service';
import { Usuario } from '../registro/usuario';
import { MatSnackBar } from '@angular/material/snack-bar';
import { MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material';
import { Mensaje } from './mensaje';
import * as io from 'socket.io-client';

@Component({
    selector: 'chat',
    templateUrl: './chat.component.html',
    providers: [UsuariosService]
})
export class ChatComponent{

    public usuario:Usuario;
    public amigo:Usuario;
    public mensajes:Mensaje[];
    public texto:string;
    private socket;

    constructor(
        public dialogRef: MatDialogRef<ChatComponent>,
        @Inject(MAT_DIALOG_DATA) public data: any,
        private _usuariosService: UsuariosService,
        public snackBar:MatSnackBar,
        public _router:Router,
    ){
        this.usuario = data.usuario;
        this.amigo = data.amigo;
        this.mensajes = new Array();
        this.texto = "";
        this.socket = io();
    }

我希望它有所帮助。