繁体   English   中英

联接到左联接Laravel中的联接查询

[英]Join to leftJoin queries in Laravel

我有一个我试图检索的查询。 它假设要获取带有其行程和位置详细信息的列表信息。

这就是我在Destinations控制器中调用查询的方式:

public function destinations($id) {

        $destination = Destination::findOrFail($id);

        $listingGuides = Listing::findGuidesTrips($destination)
            ->with('locations')
            ->withCount('trips')
            ->get(); 

         return view('destinations.index', compact('listingGuides');

}

findGuidesTrips方法位于清单模型内部:

 public static function findGuidesTrips($destination) {

        $query = self::query()
            ->leftJoin('trips', 'listing_id', '=', 'listings.id')
            ->addSelect(
                \DB::raw('listings.name,listings.slug,listings.type,listings.id,MIN(trips.cost) as starting_price')
            )
            ->groupBy('listings.id');

        $query = self::query()
            ->leftJoin('locations', 'listing_id', '=', 'listings.id')
            ->addSelect(
                \DB::raw('locations.longitude as longitude')
            )->addSelect(
                \DB::raw('locations.latitude as latitude')
            );

        $query = $query->whereHas('locations',function($query) use ($destination) {
            $query->where('region', 'like', $destination->location)->orWhere('country', $destination->location);

        });

        return $query;
    }

这就是我得到的:

在此处输入图片说明

如您所见,我有2个$ query = self :: query()查询,但是只有一个被调用(最下面的一个)。 它忽略了最高的self :: query。

我只是想知道如何将这两个leftJoin查询合并为一个? 还是有更好的方法来执行此查询?

(我尝试这样做:)

$query = self::query()
            ->leftJoin('trips', 'listing_id', '=', 'listings.id')
            ->addSelect(
                \DB::raw('listings.name,listings.slug,listings.type,listings.id,MIN(trips.cost) as starting_price')
            )
            ->leftJoin('locations', 'listing_id', '=', 'listings.id')
            ->addSelect(
                \DB::raw('locations.longitude as longitude')
            )->addSelect(
                \DB::raw('locations.latitude as latitude')
            )->groupBy('listings.id');

但这给我Integrity constraint violation: 1052 Column 'listing_id' in on clause is ambiguousIntegrity constraint violation: 1052 Column 'listing_id' in on clause is ambiguous错误

正如@Tim Lewis和@Niklesh所说,我要做的就是:

trips.listing_id用于第一个查询, locations.listing_id用于第二个查询。

这是最终查询:

public static function findGuidesTrips($destination) {

        $query = self::query()
            ->leftJoin('trips', 'trips.listing_id', '=', 'listings.id')
            ->addSelect(
                \DB::raw('listings.name,listings.slug,listings.type,listings.id,MIN(trips.cost) as starting_price')
            )
            ->leftJoin('locations', 'locations.listing_id', '=', 'listings.id')
            ->addSelect(
                \DB::raw('locations.longitude as longitude')
            )->addSelect(
                \DB::raw('locations.latitude as latitude')
            )->groupBy('listings.id');

        $query = $query->whereHas('locations',function($query) use ($destination) {
            $query->where('region', 'like', $destination->location)->orWhere('country', $destination->location);

        });

        return $query;
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM