目前我遇到了一个我无法优雅解决的问题。 鉴于此(简化)DB-Design
每个视频都有很多统计信息。到目前为止,这是一个正常的1-n关系,但是存在一些约束。
我想获取渴望加载其当前统计信息的 n 视频。 视频一次只有* n个当前统计信息,其中n是具有相同video_id *的统计信息的指标数量(不同的 metric_id )
为了实现这一点,我发现唯一可能的解决方案是一个非常复杂的查询,如下所示:
SELECT `end`, `id`, `name`, `metric_id`, `value` FROM `video`
JOIN (
SELECT `start`, `end`, `video_id`, `metric_id`, `value`
FROM (
SELECT `start`, `end`, `video_id`, `metric_id`, `value`
FROM `stat`
WHERE `video_id` = 1
ORDER BY `end` DESC
) stats
GROUP BY `video_id`, `metric_id`
) stats ON stats.video_id = video.id
WHERE `video_id` = 1
这是简化的(因为我只查询一个视频。在我完成的解决方案中,我想要将其理解为所有或多个视频)。
end
日期降序排序的给定视频的所有统计信息(因为我只想查看视频的最新统计信息)。因此,该关系需要一些非常复杂的过滤。我仍然希望利用Yii的Active Record和Eager Load。
有没有办法“挂钩”关系joinig过程(就像更现代的框架一样),或者有什么我可以在这里简化,我忽略了什么?
答案 0 :(得分:1)
如果您的关系设置正确,gii会自动设置,那么您可以执行以下操作;
$stats = Stat::model()->findAllByAttributes(array('video_id' => 1), array('order' => 'end DESC'));
访问记录和父表记录
foreach $stat as $stats {
$stat->start;
$stat->end;
// Parent table records can be accessed like so
$stat->video->name
}