laravel hasmanythrough或mysql groupby

iugsix8n  于 2021-08-09  发布在  Java
关注(0)|答案(1)|浏览(221)

我有三张table
类别

id | category_name | created_at | updated_at

轮廓

id | category_id | profile_name | created_at | updated_at

照片

id | profile_id | photo_name | photo_path | photo_type | created_at | updated_at

现在我需要列出照片的类别,也只有一张照片从每个个人资料的照片类型
我试过使用hasmanyhrough,但在不起作用的情况下使用descending

public function categoryPhotos()
  {
        return $this->hasManyThrough(ProfilePhoto::class,Profile::class);

  }

 $response=Category::with(['categoryPhotos'=>function($query){
            $query->where('profile_photos.photo_type',2);
            $query->orderBy('profile_photos.created_at','ASC');

          $query->groupBy('profile_photos.profile_id');

        }])->whereHas('categoryPhotos')->get();

如果它不可能通过laravel关系,那么mysql查询对我来说也很好。谢谢

c2e8gylq

c2e8gylq1#

可能的解决方案(如果我正确理解任务)可能是

SELECT * 
FROM category ca
JOIN profile pr ON ca.id = pr.category_id
JOIN photos ph ON pr.id = ph.profile_id
JOIN ( SELECT ph1.profile_id, MAX(ph1.id) id
       FROM photos ph1
       JOIN ( SELECT profile_id, MAX(created_at) created_at 
              FROM photos 
              WHERE phototype=2
              GROUP BY profile_id ) sq1 ON ph1.profile_id = sq1.profile_id
                                       AND ph1.created_at = sq1.created_at 
       WHERE ph1.phototype=2
       GROUP BY ph1.profile_id ) sq2  ON ph.id = sq2.id

解释。
子查询 sq1 选择最后一个 created_at 对于照片类型为2的照片的每个配置文件。
子查询 sq2 取这个结果并得到最大值 id 对于个人资料和日期时间与 sq1 (如果有多张照片符合条件,则此子查询将选择其中一张照片)。

FROM category ca
JOIN profile pr ON ca.id = pr.category_id
JOIN photos ph ON pr.id = ph.profile_id

收集所有可能的组合行-对于每个类别,它会获得所有相关的配置文件和所有相关的照片。然后我们加入我们的子查询,这个子查询过滤这个总列表,并且对于每个(类别、概要文件)对只获得一行,其中照片与我们的条件匹配(或者,如果没有这样的照片,则没有选择任何对)。
用这种纯sql形式测试它(它是否给出正确的结果?从单独的sq1执行开始,检查,如果正确,则执行sq2并再次检查,最后检查整个查询)。如果它是正确的,那么试着把它转换成拉维形式。

相关问题