2017-06-13 108 views
0

下面是我的數據庫表如何將這種原始查詢轉換成ActiveRecord的在Yii框架2

left_table 
id name 
1  A 
2  B 
3  C 
4  D 
5  E 

right_table 
id left_table_id  size  date_time 
1  1     xs  2017-06-13 14:20:00 
2  3     s   2017-06-13 14:25:00 
3  2     xs  2017-06-13 14:27:00 
4  1     s   2017-06-13 14:30:00 
5  2     m   2017-06-13 14:32:00 
6  2     xs  2017-06-13 14:33:00 
7  3     xl  2017-06-13 14:40:00 
8  4     s   2017-06-13 14:41:00 
9  4     m   2017-06-13 14:45:00 
10 5     m   2017-06-13 14:46:00 

下面是原始SQL查詢的最大(DATE_TIME)DESC其中DATE_TIME得到left_table訂單記錄< = NOW(),結果如下。受最高(add_time)DESC

SELECT t.id, t.name, r.date_time 
FROM left_table AS t 
JOIN (
    SELECT id, MAX(date_time) AS date_time 
    FROM right_table 
    WHERE date_time <= NOW() 
    GROUP BY id 
) AS r ON t.id = r.id 
ORDER BY r.date_time DESC; 

結果left_table順序

id name max(add_time) 
2  B  2017-06-13 14:33:00 
1  A  2017-06-13 14:30:00 
3  C  2017-06-13 14:25:00 

這是因爲4 left_table_id和5 date_time是> NOW()。假設NOW() = 2017-06-13 14::35:00。請注意,left_table_id 3有一個add_time > NOW(),但它仍然被選中,因爲它有其他權利記錄,add_time <= NOW()

如何使用ActiveRecordActiveQueryYii Framework 2中獲得相同的結果?該ActiveRecordActiveQuery是爲Yii GridViewActiveDataProviderPaginationLinkPager

回答

0

你可以使用一個suquery這種方式和leftjoin子查詢
(假設ChildClass和父類的僞代碼如下建議相關類 )

$subQuery = ChildClass::find()->select('id, MAX(date_time) AS date_time') 
       ->having('MAX(date_time) <=now()') 
       ->groupBy('id'); 

    $query = ParentClass::find(); 
    $query->leftJoin('R' => $subquery, 'R.id = parentTable.id') 
     ->orderBy(['R.date_time'=> SORT_DESC);