【问题标题】:query the relationship and get result according to relation query查询关系并根据关系查询得到结果
【发布时间】:2020-01-25 14:44:33
【问题描述】:

我想做一个查询来获取模型的关系,并通过在我的关系中完成的查询对父模型进行排序,如下所示:

 $data = Accommodation::with([  'accommodationRoomsLimited.discount', 'accommodationRoomsLimited', 'accommodationRoomsLimited.roomPricingHistorySearch' => function ($query) use ($from_date, $to_date) {
            $query->whereDate('from_date', '<=', $from_date);
            $query->whereDate('to_date', '>=', $to_date);
        }])->when($bed_count, function ($q, $bed_count) {
            $q->with([
                'accommodationRoomsLimited' => function ($q) use ($bed_count) {
                    $q->where('bed_count', $bed_count);
                }
            ]);

因此,当用户为 i 发送 bed_count 3 时,此查询仅显示 bed_count 为 3 的房间,如果不是,则显示住宿但空房间对象为关系。我希望我的结果是这样的,如果房间没有 3 的 bed_count 住宿,它自己不会在结果中显示。我怎样才能做到这一点?谢谢。

【问题讨论】:

    标签: php laravel


    【解决方案1】:

    也许如果你使用whereHas而不是with,你可以做到:

    $data = Accommodation::with([  'accommodationRoomsLimited.discount', 'accommodationRoomsLimited', 'accommodationRoomsLimited.roomPricingHistorySearch' => function ($query) use ($from_date, $to_date) {
            $query->whereDate('from_date', '<=', $from_date);
            $query->whereDate('to_date', '>=', $to_date);
        }])->when($bed_count, function ($q, $bed_count) {
            $q->whereHas('accommodationRoomsLimited', function($query) use ($bed_count) {
                $query->where('bed_count', $bed_count);
            });
    

    更新

    if ($bed_count !== null) {
        $data = Accommodation::whereHas('accommodationRoomsLimited', function($query) use ($bed_count) {
            $query->where('bed_count', $bed_count);
        })->with(['accommodationRoomsLimited.discount', 'accommodationRoomsLimited', 'accommodationRoomsLimited.roomPricingHistorySearch' => function ($query) use ($from_date, $to_date) {
            $query->whereDate('from_date', '<=', $from_date);
            $query->whereDate('to_date', '>=', $to_date);
        }])->get();
    } else {
        $data = Accommodation::with([  'accommodationRoomsLimited.discount', 'accommodationRoomsLimited', 'accommodationRoomsLimited.roomPricingHistorySearch' => function ($query) use ($from_date, $to_date) {
            $query->whereDate('from_date', '<=', $from_date);
            $query->whereDate('to_date', '>=', $to_date);
        }])->get();
    }
    

    希望对你有帮助。

    【讨论】:

    • 它只是对具有房间关系的住宿进行查询,但当它为空时它再次返回酒店
    • 检查我的更新。我认为如果你先添加wherehas,它会解决这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-22
    • 1970-01-01
    • 1970-01-01
    • 2020-11-08
    • 2012-09-06
    • 1970-01-01
    相关资源
    最近更新 更多