如何在 Yii Framework 2 中将此原始查询转换为 ActiveRecord



下面是我的数据库表

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 查询,用于获取 max(date_time( DESC 的left_table顺序记录,其中 date_time <= NOW(( 作为以下结果。

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按最大(add_time(顺序排列

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 和 5 的 left_table_id date_time是 NOW((>。假设NOW() = 2017-06-13 14::35:00 .请注意,left_table_id 3 有一个add_time > NOW()但仍被选中,因为它具有其他正确的记录,add_time <= NOW()

如何使用ActiveRecordActiveQueryYii Framework 2中获得相同的结果?ActiveRecordActiveQuery适用于带ActiveDataProvider Yii GridView或带LinkPager Pagination

你可以这样使用后查询,左联接子查询
(假设 ChildClass 和 ParentCLass 作为相关类在伪代码中,下面的建议(

  $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);

最新更新