【问题标题】:Laravel Eloquent one to many relationship, dynamically adding query to the related tableLaravel Eloquent 一对多关系,动态添加查询到相关表
【发布时间】:2017-12-21 06:21:23
【问题描述】:

我昨天在这里问了一个问题 (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);

我更新的 uqery:

$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


    【解决方案1】:

    我认为问题出在这里:

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

    你应该使用:

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

    因为您使用的是子查询,而您有 amenities,所以要引用它们的 id,您应该只使用 id 列。

    【讨论】:

    • 我有 amenities_room 表包含 room_idamenities_id
    • 但是你想得到什么计数?在withCount 中,您在amentities 上运行,而不是在amentities_room 上运行。也许你想把$query->whereIn('amenities_id', $amenities);移到withCount之外呢?
    • 从字面上看,我不知道查询发生了什么,让我学习并回来
    • @arunkumar 我认为您应该使用一些 SQL 记录器来查看执行的查询。您可以使用我的github.com/mnabialek/laravel-sql-loggergithub.com/barryvdh/laravel-debugbar 来验证它们
    【解决方案2】:

    我认为,您正在寻找“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();
    

    【讨论】:

    • 你可以试试 DB::enableQueryLog(); // laravvel 查询 exec dd(DB::getQueryLog());准确获取该构建器正在运行的 sql。
    猜你喜欢
    • 2018-06-18
    • 2021-09-25
    • 2017-11-03
    • 2014-10-31
    • 2013-02-09
    • 2013-10-03
    • 2017-07-19
    • 1970-01-01
    • 2020-12-15
    相关资源
    最近更新 更多