首页 > 解决方案 > 查询关系并根据关系查询得到结果

问题描述

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

 $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,它自己不会在结果中显示住宿。我怎样才能做到这一点?谢谢 。

标签: phplaravel

解决方案


也许如果你使用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();
}

希望能帮助到你。


推荐阅读