首页 > 解决方案 > 不在两者之间的laravel查询不起作用

问题描述

我必须在给定日期和时间(早上和晚上)搜索大厅进行预订。我如何使用 laravel 查询从数据中找到可用日期。如果我搜索日期 11-02-2019 到 27-02-2019 。它应该只返回“这些日期不可用!”。在此查询中,它返回预订 3。此查询有什么问题?我已经发布了数据库图像。

数据库映像

public function getAvailableEvents(Request $request)
{
    try {
        $allInputs = Input::all();
        $categoryID = $request->input('category_id');
        $startDate = $request->input('start_date');
        $endDate = $request->input('end_date');
        $time = $request->input('time');

        $validation = Validator::make($allInputs, [
            'category_id' => 'required',
            'start_date' => 'required',
            'end_date' => 'required',
            'time' => 'required',
        ]);
        if ($validation->fails()) {
            DB::rollback();
            return $response = (new apiresponse())->customResponse('Fields required!',
                422,
                $validation->errors()->toArray());
        } else {

            $getEvents = Booking::where('category_id', '=', $categoryID)
            ->where('booking_time', '!=', $time)
            ->where('date_from', '!=', $startDate)
            ->where('date_to', '!=', $endDate)
            ->orWhere('date_from', '<', $startDate)
            ->orWhere('date_to', '>', $endDate)
            ->whereNotBetween('date_from', [$startDate,$endDate])
            ->whereNotBetween('date_to', [$startDate,$endDate])
            ->whereRaw("? NOT BETWEEN date_from AND date_to", [$startDate, $endDate])
            ->get();
           // dd($getEvents);

            if (count($getEvents) > 0) {
                $data = array();
                for ($i = 0; $i < count($getEvents); $i++) {
                    $data[] = array(

                        "booking_id" => $getEvents[$i]->id,
                        "ref_no" => $getEvents[$i]->ref_no,
                        "category_id" => $getEvents[$i]->category_id,
                        "event_id" => $getEvents[$i]->event_id,
                        "user_id" => $getEvents[$i]->user_id,
                        "phone" => $getEvents[$i]->phone,
                        "booking_status" => $getEvents[$i]->booking_status,
                        "type" => $getEvents[$i]->type,
                        "date_from" => $getEvents[$i]->date_from,
                        "date_to" => $getEvents[$i]->date_to,
                        "booking_time" => $getEvents[$i]->booking_time,
                        "price" => $getEvents[$i]->price,
                        "rating" => $getEvents[$i]->rating,
                        "date_time" => $getEvents[$i]->date_time ?? "",

                    );
                }
                return $response = (new apiresponse())->customResponse('Events found!',
                    200,
                    $data);

            } else {
                DB::rollback();
                return $response = (new apiresponse())->customResponse(
                    'These dates are not available!',
                    422,
                    (object)[]);
            }
        }

    } catch (\Illuminate\Database\QueryException $ex) {
        return $response = (new apiresponse())->customResponse(
            'Fail!',
            422,
            $ex);
    }
}

标签: laraveleloquent

解决方案


小于/大于比较不能可靠地与varchar日期列上的数据类型一起工作。

如果可以,请将列类型更改为DATE(或类似的特定于日期的类型,任何适合您的应用程序的类型)。然后比较将按预期工作。

如果不能,可以使用该STR_TO_DATE()函数转换为日期,然后进行比较。


推荐阅读