所以,有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)
但如何正确使用这个?
查询会像下面那样.我会尝试运行本机查询,而不是试图找出如何使用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)