Php 如何从laravel中的2个联接中删除重复项

Php 如何从laravel中的2个联接中删除重复项,php,mysql,laravel,Php,Mysql,Laravel,我正在使用Spatial laravel query builder为我的项目制作一些过滤器,代码如下: public function scopeFilter() { $data = QueryBuilder::for(Accommodation::class) ->allowedFilters([ AllowedFilter::scope('bed_count'), Allo

我正在使用Spatial laravel query builder为我的项目制作一些过滤器,代码如下:

public function scopeFilter()
    {
        $data = QueryBuilder::for(Accommodation::class)
            ->allowedFilters([
                AllowedFilter::scope('bed_count'),
                AllowedFilter::scope('filter_price'),
                AllowedFilter::scope('filter_date'),
                AllowedFilter::scope('discounts'),
                AllowedFilter::scope('name'),
                AllowedFilter::exact('grade_stars'),
                AllowedFilter::exact('city_id'),
                AllowedFilter::exact('is_recommended'),
                AllowedFilter::exact('accommodation_type_id'),
                AllowedFilter::scope('accommodation_facility')
//                'name',
            ])
            ->allowedAppends(['cheapestroom'])
            ->allowedIncludes(['gallery','city','accommodationRooms','accommodationRooms.roomPricingHistorySearch','discounts','prices'])
            ->allowedSorts([
                AllowedSort::custom('discount', new DiscountSort() ,'amount'),
                AllowedSort::custom('price', new PriceSort() ,'price'),
            ])
            ->paginate(12);
        return FilterResource::collection($data);
现在我有1个排序和2个过滤器,这对我来说非常重要,这里是它们的代码

分类 作为作用域写入的第一个筛选器
谢谢

我想下面的代码适合您

排序

$data = $query->join('accommodation_rooms as cr', 'accommodations.id', '=', 'cr.accommodation_id')
             ->join('accommodation_rooms as cr2', 'accommodations.id', '=', 'cr2.accommodation_id')
            ->leftJoin('room_pricing_histories as dr','cr.id', '=', 'room_pricing_histories.accommodation_room_id')
//            ->select('cr.id')

            ->orderBy('dr.sales_price', 'desc')
            ->where('cr.id !=','cr2.id')
            ->select('dr.sales_price', 'accommodations.*')
            ->groupBy('dr.sales_price','accommodations.id');
        $direction = $descending ? 'DESC' : 'ASC';

        return $data;

我想->distinct()就是你要找的。不,先生,它不起作用。你在select()中尝试过“distinct”吗?@AnatoliyR如何在select中进行distinct?不确定。但是类似于->选择('distinct accountations.*')的东西不是Laravel推荐的,但可能会起作用,实际上->选择('accountations.*')->distinct()可能不起作用,您需要使用类似于table('accountations')->distinct()的东西。最后,您可以在结果集集合中尝试筛选DUP
 public function scopeFilterPrice(Builder $query, $start_price, $end_price): Builder
    {
        $data = $query->leftjoin('accommodation_rooms as ar','ar.id','=','accommodations.id')
            ->leftjoin('room_pricing_histories','room_pricing_histories.id','=','ar.id')
            ->select('accommodations.*')
            ->where('room_pricing_histories.sales_price', '>', $start_price)
            ->where('room_pricing_histories.sales_price', '<', $end_price);
        return $data;
    }
public function scopeFilterDate(Builder $query,$from_date,$to_date): Builder{

        $data = $query->leftjoin('accommodation_rooms as br','br.id','=','accommodations.id')
            ->Join('room_capacity_histories','room_capacity_histories.id','=','br.id')
            ->select('accommodations.*')
            ->whereDate('room_capacity_histories.from_date', '>', $from_date)
            ->whereDate('room_capacity_histories.to_date', '<', $to_date);

        return $data;
"select `dr`.`sales_price`, `accommodations`.* from `accommodations` left join `accommodation_rooms` as `ar` on `ar`.`id` = `accommodations`.`id` left join `room_pricing_histories` on `room_pricing_histories`.`id` = `ar`.`id` left join `accommodation_rooms` as `br` on `br`.`id` = `accommodations`.`id` inner join `room_capacity_histories` on `room_capacity_histories`.`id` = `br`.`id` inner join `accommodation_rooms` as `cr` on `accommodations`.`id` = `cr`.`accommodation_id` inner join `room_pricing_histories` as `dr` on `cr`.`id` = `room_pricing_histories`.`accommodation_room_id` where `room_pricing_histories`.`sales_price` > ? and `room_pricing_histories`.`sales_price` < ? and date(`room_capacity_histories`.`from_date`) > ? and date(`room_capacity_histories`.`to_date`) < ? group by `dr`.`sales_price`, `accommodations`.`id` order by `dr`.`sales_price` desc"
$data = $query->join('accommodation_rooms as cr', 'accommodations.id', '=', 'cr.accommodation_id')
             ->join('accommodation_rooms as cr2', 'accommodations.id', '=', 'cr2.accommodation_id')
            ->leftJoin('room_pricing_histories as dr','cr.id', '=', 'room_pricing_histories.accommodation_room_id')
//            ->select('cr.id')

            ->orderBy('dr.sales_price', 'desc')
            ->where('cr.id !=','cr2.id')
            ->select('dr.sales_price', 'accommodations.*')
            ->groupBy('dr.sales_price','accommodations.id');
        $direction = $descending ? 'DESC' : 'ASC';

        return $data;