如何从另一张桌子获得最受欢迎的物品?

Mav*_*ave 6 php yii2

所以,有User模型和Item模型.这是一个多对多关系:一个项目可以属于许多用户,一个用户可以有很多项目.因此,有UserItemRel模型.

总结一下:

item
 id
 name
 date_created
 date_updated

user
 id
 email
 password
 date_created
 date_updated

user_item_rel
 user_id
 item_id
 date_created
Run Code Online (Sandbox Code Playgroud)

在切换到Yii2之前,我的查询是这样的:

SELECT COUNT(UIR.`user_id`) as `favourited`, IT.`id`, IT.`name`, CA.`name` as `category`
    FROM `user_item_rel` UIR
    LEFT JOIN `item` IT ON UIR.`item_id` = IT.`id`
    LEFT JOIN `category_item` CI ON UIR.`item_id` = CI.`item_id`
    LEFT JOIN `category` CA ON CI.`category_id` = CA.`id`
    WHERE UIR.`date_created` >= (SYSDATE() - INTERVAL 3 YEAR)
    GROUP BY UIR.`item_id`
    ORDER BY
        `favourited` DESC
    LIMIT 20
Run Code Online (Sandbox Code Playgroud)

我使用了yii2-enhanced-gii扩展来生成模型.

我希望在过去48小时内显示20个最受青睐的商品,包括他们的数量.我正在从Yii1.1迁移,到目前为止一直都是这样,我无法弄清楚这一点.

我发现了

$this->hasMany(UserItemRel::className(), ['id' => 'user_id'])
                    ->viaTable('user_item_rel', ['id' => 'item_id'], function ($query) {
                        $query->andWhere(['date_created < INTERVAL 2 DAY'])
                        ->orderBy(['COUNT(*)' => SORT_DESC]);
                    });
}
Run Code Online (Sandbox Code Playgroud)

但如何正确使用这个?

Roe*_*zen 5

查询会像下面那样.我会尝试运行本机查询,而不是试图找出如何使用orm完成此操作.

SELECT item_id, item.name, count(*) favorite
FROM user_item_rel
LEFT JOIN user ON user.id = user_item_rel.user_id 
LEFT JOIN item ON item.id = user_item_rel.item_id
WHERE user_item_rel.date_created >= (sysdate() -  interval 2 DAY)
GROUP BY item_id, name
ORDER BY favorite DESC
LIMIT 20
Run Code Online (Sandbox Code Playgroud)