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();
假设我有一些运动员,他们的照片属于相册,属于活动。
获取运动员照片最快的方法是$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();