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

时间:2017-06-13 15:03:23

标签: php mysql sql yii2

以下是我的数据库表

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

下面是通过max(date_time)DESC获取left_table顺序记录的原始sql查询,其中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按max(add_time)DESC

排序
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

这是因为date_time的{​​{1}}的4和5是&gt;现在()。假设left_table_id。请注意,left_table_id 3有一个NOW() = 2017-06-13 14::35:00,但仍然会被选中,因为它有其他正确的记录,add_time > NOW()

如何使用add_time <= NOW()ActiveRecordActiveQuery中获得相同的结果? Yii Framework 2ActiveRecord适用于ActiveQuery Yii GridViewActiveDataProvider Pagination

1 个答案:

答案 0 :(得分:0)

你可以用这种方式使用suquery并且左边连接子查询 (假设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);