Laravel Eloquent一对多关系,动态地向相关表添加查询

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

我昨天在这里问过一个问题(Laravel Eloquent query build select min value)。从那我我更新我的查询选择房间。

我以前的查询:

$buildquery=Room::

        with(['hotel' => function ($query) {
            $query->where('status', 0);
        }])

        ->with('image')->with('amenities');

        if ($request->filled('location_id')) {

            $buildquery->Where('city', $request->location_id);
            //print_r($request->location_id);
        }

        // If amenities is there add it to query
        if($request->filled('amenities')){
            $amenities = $request->amenities;
            $count = count($amenities);

            $buildquery->withCount(['amenities' => function($query) use ($amenities){
                            $query->whereIn('amenities_id', $amenities);
                        }])
                        ->having('amenities_count', $count);
        }


        // If price is there add it to query
        if ($request->filled('min_price')) {
            $buildquery->whereBetween('price', [$request->min_price, $request->max_price]);    
        }

        $buildquery->Where('astatus', 1)->Where('status', 0);

        //$buildquery->orderBy('price', 'DESC')->take(1);

        $rooms = $buildquery->simplePaginate(20);

我的更新查询:

$rooms = Hotel::with(['room' => function($query) {
            $query->orderBy('price', 'asc')->first();
        },
        'room.image',
        'room.amenities'])
        ->get();

我遇到了一个问题。如果用户选择便利设施,那么只有我包括以下查询,

if($request->filled('amenities')){
                $amenities = $request->amenities;
                $count = count($amenities);

                $buildquery->withCount(['amenities' => function($query) use ($amenities){
                                $query->whereIn('amenities_id', $amenities);
                            }])
                            ->having('amenities_count', $count);
            }

如何将此添加到我更新的查询?

试过这种方式,但没有运气

$rooms = Hotel::with(['room' => function($query) {
            $query->orderBy('price', 'asc')->first();
        },
        'room.image',
        'room.amenities' => function($query) {
            $query->withCount(['amenities' => function($query) use ($amenities){
                            $query->whereIn('amenities_id', $amenities);
                        }])
                        ->having('amenities_count', $count);
        }])->get();
php laravel laravel-5 eloquent laravel-5.5
2个回答
0
投票

我认为问题在于:

$query->whereIn('amenities_id', $amenities);

而不是这个你应该使用:

$query->whereIn('amenities.id', $amenities);

因为你正在使用子查询,你有amenities所以要引用它们你应该只使用id列。


0
投票

我想,你正在寻找'whereHas'构建器功能。 https://laravel.com/docs/5.5/eloquent-relationships#querying-relationship-existence

$rooms = Hotel::with(['room' => function($query) {
            $query->orderBy('price', 'asc')->first();
        },
        'room.image',
    }])
    ->whereHas('amenities', function ($query) use ($amenities) {
        $query->whereIn('id', $amenities);
    })
    ->get();
© www.soinside.com 2019 - 2024. All rights reserved.