Laravel postgres Distinct ON 查询构建器

时间:2021-06-04 14:39:39

标签: php laravel eloquent

我想通过使用查询构建器使这个查询成为最可能的 Laravel 方式。 谢谢

   SELECT DISTINCT ON (spaceid) * FROM (SELECT DISTINCT ON (galleryid) * FROM gallery_spaces ORDER BY galleryid, RANDOM()) AS intermediate ORDER BY spaceid, RANDOM() LIMIT 8

抱歉,这是我所能得到的最接近的,但它不一样

  $diferentsGalleries = GallerySpace::select(DB::raw('DISTINCT ON(galleryid) *'))
                                    ->wherehas('gallery')
                                    ->orderByRaw('galleryid, RANDOM()')
                                    ->limit(30)
                                    ->pluck('id');

  $featured_spaces = GallerySpace::select(DB::raw('DISTINCT ON(spaceid) *'))
                                ->with('space')
                                ->with('gallery')
                                ->wherein('id',$diferentsGalleries)
                                ->orderByRaw('spaceid, RANDOM()')
                                ->limit(8)
                                ->get();

2 个答案:

答案 0 :(得分:0)

我终于想通了。

$featured_spaces = GallerySpace::select(DB::raw('DISTINCT ON (spaceid) *'))
                                  ->fromSub(function ($query) {
                                            $query->from('gallery_spaces')
                                                  ->select(DB::raw('DISTINCT ON (galleryid) *'))
                                                  ->orderby('galleryid')
                                                  ->inrandomorder();}, 'intermediate')
                                  ->orderby('spaceid')
                                  ->inrandomorder()
                                  ->limit(8)     
                                  ->get();

答案 1 :(得分:-1)

Laravel 提供了很多方法,没有一个比其他方法更好,让您的查询最简单的方法是使用 db facade

$result=DB::select("SELECT DISTINCT ON (spaceid) * FROM (SELECT DISTINCT ON (galleryid) * FROM gallery_spaces ORDER BY galleryid, RANDOM()) AS intermediate ORDER BY spaceid, RANDOM() LIMIT 8");
相关问题