php - 如何从另一个表中获取最喜欢的项目?

标签 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

在切换到 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

我用过 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]);
                    });
}

但是如何正确使用呢?

最佳答案

查询类似于下面的内容。我会尝试运行 native 查询,而不是尝试找出如何使用 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

关于php - 如何从另一个表中获取最喜欢的项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32156761/

相关文章:

javascript - FullCalendar PHP 和 MySQL 集成,事件不更新

php - 如何计算while语句运行了php和sql的次数

yii2 - 如何在 Yii2 表单错误摘要中显示 HTML 标签

php - Yii2 GridView SqlDataprovider 排序不工作

php - 如何使用增量来计算超过一定价格的东西

php - InnoDB 数据库表耗时 51 秒

php - 在 yii2/codeception 数据文件中引用 fixture 记录

php - 如何增加容器宽度以修复 yii2 中的 GridView 滚动

authentication - Yii2中模块的访问控制

javascript - 在 PHP 中更新图像的问题