我有三张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查询对我来说也很好。谢谢
1条答案
按热度按时间c2e8gylq1#
可能的解决方案(如果我正确理解任务)可能是
解释。
子查询
sq1
选择最后一个created_at
对于照片类型为2的照片的每个配置文件。子查询
sq2
取这个结果并得到最大值id
对于个人资料和日期时间与sq1
(如果有多张照片符合条件,则此子查询将选择其中一张照片)。收集所有可能的组合行-对于每个类别,它会获得所有相关的配置文件和所有相关的照片。然后我们加入我们的子查询,这个子查询过滤这个总列表,并且对于每个(类别、概要文件)对只获得一行,其中照片与我们的条件匹配(或者,如果没有这样的照片,则没有选择任何对)。
用这种纯sql形式测试它(它是否给出正确的结果?从单独的sq1执行开始,检查,如果正确,则执行sq2并再次检查,最后检查整个查询)。如果它是正确的,那么试着把它转换成拉维形式。