在基于 Laravel 的项目中比较日期时出现查询问题

问题描述 投票:0回答:1

我正在从事公寓租赁项目。作为应用程序功能的一部分,公寓业主可以选择公寓可供客人出租的日期。我正在编写一个搜索查询来获取公寓,其中它会检查可出租的天数。我有以下表格:房间、预订、天数、day_room(数据透视表)。由于我是新来的,如果我需要发布其他内容以便您更好地了解我的问题,请告诉我。

在这个查询中,当我在最后一个Where方法中写入静态日期(例如'2024-06-27')时,它会很好地工作并产生所需的结果,但是当使用 $date->format('Y-m-d') 时它没有找到任何东西。然而,在生成的 SQL 查询中,我没有看到有任何差异,即日期格式。

    namespace App\Http\Controllers;

    use App\Models\Room;
    use App\Models\Booking;
    use Carbon\CarbonPeriod;
    use Carbon\Carbon;
    use Illuminate\Http\Request;
    use Illuminate\Support\Facades\DB;

    class SearchController extends Controller
    {
        public function index()
        {
        // Validate data later

        $city = request('city');
        $guests_number = request('guests_number');
        $object_type = request('object_type');
        $checkIn = request('checkIn');
        $checkOut = request('checkOut');

        $interval = CarbonPeriod::create($checkIn, $checkOut);

        $rooms = Room::query()
            ->with(['photos', 'bookings', 'days'])
            ->where('rooms.city_id', '=', $city)
            ->where('rooms.beds_num', '>=', $guests_number)
            ->where('rooms.object_type_id', '=', $object_type)
            ->join('bookings', 'bookings.room_id', '=', 
              'rooms.id')
            ->where(function ($query) use ($checkIn, $checkOut) {
                $query->where('checkIn', '>=', $checkOut)
                    ->orWhere('checkOut', '<=', $checkIn);
            })
            ->whereExists(function ($query) use ($interval) {
                $query
                    ->from('day_room')
                    ->join('days', 'days.id', '=', 'day_room.day_id')
                    ->whereColumn('day_room.room_id', 'rooms.id')
                    ->where(function ($query) use ($interval) {
                        foreach ($interval as $date) {
                            $query->where('days.day', '=', $date->format('Y-m-d'));
                            // when testing if I write static date like here, then it works.
                            // $query->where('days.day', '=', '2024-06-27');
                        }
                    });
            })
            ->get('rooms.*');

        return view('results', ['rooms' => $rooms]);
    }
laravel date foreach
1个回答
0
投票

感谢大家在评论部分的反馈。 @Rene 和 @Tupkap 让我思考了一个正确的方向 - 我正在检查一个单元格的多天。我通过移动 foreach 循环解决了这个问题。下面是对我有用的代码的编辑版本。我想这不是解决问题的最优雅的方法,但因为公寓不适合长期预订(通常是几天,不超过 1-2 周)。

    namespace App\Http\Controllers;

use App\Models\Room;
use App\Models\Booking;
use Carbon\CarbonPeriod;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class SearchController extends Controller
{
    public function index()
    {
        // Validate data later

        $city = request('city');
        $guests_number = request('guests_number');
        $object_type = request('object_type');
        $checkIn = request('checkIn');
        $checkOut = request('checkOut');

        $interval = CarbonPeriod::create($checkIn, $checkOut);

        $rooms = Room::query()
            ->with(['photos', 'bookings', 'days'])
            ->where('rooms.city_id', '=', $city)
            ->where('rooms.beds_num', '>=', $guests_number)
            ->where('rooms.object_type_id', '=', $object_type)
            ->join('bookings', 'bookings.room_id', '=', 'rooms.id')
            ->where(function ($query) use ($checkIn, $checkOut) {
                $query->where('checkIn', '>=', $checkOut)
                    ->orWhere('checkOut', '<=', $checkIn);
            })
            ->where(function ($query) use ($interval) {
                foreach ($interval as $date) {
                    $query->whereExists(function ($query) use ($date) {
                        $query
                            ->from('day_room')
                            ->join('days', 'days.id', '=', 'day_room.day_id')
                            ->whereColumn('day_room.room_id', 'rooms.id')
                            ->where('days.day', '=', $date->format('Y-m-d'));
                    });
                }
            })
            ->get('rooms.*');

        return view('results', ['rooms' => $rooms]);
    }
© www.soinside.com 2019 - 2024. All rights reserved.