child 在 Laravel 组织收集

Organize collection by child in Laravel

假设我有一些运动员,他们的照片属于相册,属于活动。

获取运动员照片最快的方法是$athlete->photos;

如果我往这个方向走:

$events= Event::whereHas('albums.photos.athletes', function ($q)
{
   $q->where('athlete_id', $this->athlete->id);

})

它有效,但速度较慢,而且我无法执行 $events->albums 之类的操作,并且只能执行包含该特定运动员照片的 return 相册。

在我的页面上,我想按事件显示照片。我如何使用 $athlete->photos 然后按事件组织它们?

我可以遍历从 $athlete->photos 中找到的所有照片,并使用事件->相册->照片的层次结构构建一个新数组,但这看起来真的很糟糕。使用 Eloquent 有更好的方法吗?

编辑:

这 return 正是我需要的数据,无需进一步查询,但需要将近 20 秒才能完成。

// Get all athlete media
$competitions = Competition::whereHas('publishedAlbums.publishedMedia.athletes', function ($q)
{
    $q->where('athlete_id', $this->athlete->id);

})
    ->with(array('publishedAlbums.publishedMedia' => function($query)
    {
        $query->whereHas('athletes', function ($q)
        {
            $q->where('athlete_id', $this->athlete->id);

        });
    }))
    ->with(array('publishedAlbums' => function($query)
    {
        $query->whereHas('publishedMedia.athletes', function ($q)
        {
            $q->where('athlete_id', $this->athlete->id);

        });
    }))
    ->get();

有了它,我可以执行 $competitions->publishedAlbums 之类的操作,它只显示包含该运动员媒体的相册。但是执行起来需要很长时间。

看来这可以大大简化。

这能满足您的需求吗?它是否更快?

$competitions = Competition::with('publishedAlbums.publishedMedia.athletes')
    ->whereHas('publishedAlbums.publishedMedia.athletes', function($q)
    {
        $q->where('athlete_id', $this->athlete->id);
    })->get();