簡體   English   中英

Yii1中關系的復雜過濾

[英]Complex Filtering of Relations in Yii1

目前,我遇到了一個無法優雅解決的問題。 給出了這個(簡化的)DB設計

簡化的ER圖

每個視頻都有許多統計信息。 到目前為止,這是一個正常的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

SQL小提琴

這被簡化了(因為我只查詢一個視頻。在完成的解決方案中,我想將其理解為所有或多個視頻)。

  • 最內層查詢:獲取所有統計信息,並按end日期降序排列給定視頻(因為我只需要視頻的最新統計信息)。
  • 內部查詢:將以前抓取的統計信息按video_id和metric_id分組,因為我希望視頻的每個統計信息僅獲取一次
  • 外部查詢:將經過過濾的統計信息與實際視頻一起加入。

因此,對於該關系需要進行一些非常復雜的過濾。 我仍然想充分利用Yii的Active Record和Eager Load。

是否有任何辦法可以“鈎住”關系連接過程(就像更現代的框架一樣),或者有什么我可以簡化但被我忽略的事情嗎?

如果您正確設置了關系,那么哪個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         
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM