Php Yii2属性由虚拟属性+;属性,将Sql联合到Yii2 AR 第一篇文章,但我已经在这里几个月了,从未注册(直到今天)。谢谢你的帮助。 问题是:

Php Yii2属性由虚拟属性+;属性,将Sql联合到Yii2 AR 第一篇文章,但我已经在这里几个月了,从未注册(直到今天)。谢谢你的帮助。 问题是:,php,mysql,yii2,Php,Mysql,Yii2,我有两张桌子:T1和T2 T1为设备表,T2为设备文件表。每个设备都有一些日期为数据计划的文档。当T2数据计划中的数据仅为日期时,T1数据计划(虚拟属性)通过NOW()+间隔co\u zostalo计算。只有当T1中的co\u data=1时,才能获得数据计划作为天数间隔 T2的数据计划必须是最早的日期 我在获取价值方面没有任何问题: 在T1模型中 当然,我声明并使用虚拟属性来收集数据:$nextActionDate 问题是排序和过滤数据。 分类 第一次尝试: $query = KartaPrz

我有两张桌子:T1和T2

T1为设备表,T2为设备文件表。每个设备都有一些日期为数据计划的文档。当T2数据计划中的数据仅为日期时,T1数据计划(虚拟属性)通过NOW()+间隔co\u zostalo计算。只有当T1中的co\u data=1时,才能获得数据计划作为天数间隔 T2的数据计划必须是最早的日期

我在获取价值方面没有任何问题: 在T1模型中

当然,我声明并使用虚拟属性来收集数据:$nextActionDate

问题是排序和过滤数据。 分类 第一次尝试:

$query = KartaPrzyrzadu::find()->groupBy(['id_przyrz']);
        $query->joinWith('dzialania');


    $dataProvider = new ActiveDataProvider([
        'query' => $query,
    ]);

    $dataProvider->sort->attributes['nextActionDate'] = [
        // 1st try 'asc' => ['least(dzialania.data_plan, NOW() + interval co_zostalo day)' => SORT_ASC],
        // 1st try 'desc' => ['least(dzialania.data_plan, NOW() + interval co_zostalo day)' => SORT_DESC]
        // 2nd try 'asc' => [new \yii\db\Expression('CASE WHEN karta_przyrzadu.co_data = 0 THEN dzialania.data_plan END ASC, CASE WHEN co_data = 1 THEN NOW() + interval co_zostalo day END ASC')],
        // 2nd try 'desc' => [new \yii\db\Expression('CASE WHEN karta_przyrzadu.co_data = 0 THEN dzialania.data_plan END DESC, CASE WHEN co_data = 1 THEN NOW() + interval co_zostalo day END DESC')],
    ];
不,我想弄明白为什么它不起作用。 当然还有sql代码

第二次尝试:使用纯sql(还没有在代码中实现它,我现在正在测试sql)——这几乎就是我所需要的

`SELECT id_przyrz ,MIN(data_plan) as data_plan FROM
(
(SELECT `karta_przyrzadu`.`id_przyrz`, NOW() + interval co_zostalo day as `data_plan` FROM `karta_przyrzadu` WHERE NOT (`karta_przyrzadu`.`status`='Wycofany') and co_data = 0)
UNION
(SELECT `dzialania`.`id_przyrz_d` AS `id_przyrz`, `data_plan` FROM `dzialania` where wyk ="Nie" order by data_plan ASC)
) 
`data_kart` group by id_przyrz ORDER BY `data_plan` DESC`
我需要的是(我想)将它与T1表的其余部分进行内部连接,但如何连接呢? (我需要网格中的所有数据,而不仅仅是id_przyrz和data_plan)

过滤 我认为有足够的数据来理解这个问题

谢谢

找到合适的SQL,现在如何使用AR?所以我可以正确地分类。。。
`SELECT id_przyrz ,MIN(data_plan) as data_plan FROM
(
(SELECT `karta_przyrzadu`.`id_przyrz`, NOW() + interval co_zostalo day as `data_plan` FROM `karta_przyrzadu` WHERE NOT (`karta_przyrzadu`.`status`='Wycofany') and co_data = 0)
UNION
(SELECT `dzialania`.`id_przyrz_d` AS `id_przyrz`, `data_plan` FROM `dzialania` where wyk ="Nie" order by data_plan ASC)
) 
`data_kart` group by id_przyrz ORDER BY `data_plan` DESC`
if (!is_null($this->nextActionDate) && strpos($this->nextActionDate, ' - ')     !== false ) {
        list($dateRangeStart, $dateRangeEnd) = explode(' - ', $this->nextActionDate);
            $query->andFilterWhere(['between', 'dzialania.data_plan', $dateRangeStart, $dateRangeEnd])
            ->orFilterWhere(['between', 'NOW() + interval co_zostalo day', $dateRangeStart, $dateRangeEnd]);
        }
SELECT * from (
SELECT id_przyrz, MIN(data_plan) as data_plan FROM
    (
        (SELECT `id_przyrz`, NOW() + interval co_zostalo day as `data_plan` FROM `karta_przyrzadu` WHERE NOT (`status`='Wycofany') and co_data = 0)
        UNION
        (SELECT `id_przyrz_d` AS `id_przyrz`, `data_plan` FROM `dzialania` where wyk ="Nie" order by data_plan ASC)
    ) as `table1` group by id_przyrz ORDER BY `data_plan` DESC
) as `full` left join karta_przyrzadu as full_on on full.id_przyrz = full_on.id_przyrz