2018-08-16 17:55:34 2125次浏览 4条回答 0 悬赏 200 金钱

文章表A:id, title
点赞表B,id, a_id(A表id),user_id(用户ID)
查询出的数据结构:
{
id(表A的): 1,
title : 一篇文章,
like_number(点赞数): 36
}
除了left join的方式,能不能AR的关联查询with,查出这种数据结构,不多查,不少查。

补充于 2018-08-16 18:27

我目前能想到的最优雅的方式

A::find()->select([ '*', 'like_count' => B::find()->select('a_id')->count() ])->asArray()->all()

  • 回答于 2018-08-16 20:34 举报

    我自己的文章点赞功能 是把vote_number字段直接放在文章article表里面 用户点赞 触发一个事件 vote_number自动加一 取消点赞 vote_number自动减一 然后查询点赞数 直接从文章表 vote_number字段取值 如果想知道谁给点过赞 再去点赞表里面查询

    2 条回复
    回复于 2018-08-17 10:39 回复

    嗯,这是一个办法,但是会有并发问题呀

    回复于 2018-08-17 15:48 回复

    并发大的话 把 article_id和vote_number字段 独立建在一个表里边

  • 回答于 2018-08-16 20:35 举报

    字段自动加一 自动减一
    是用yii\db\Expression实现的

    1 条回复
    回复于 2018-08-17 23:32 回复

    // 实现的效果就是 view_count + 1,1根据你的需求可以是正数也可以是负数。
    $model::updateAllCounters(['view_count' => 1], ['id' => $id]);

  • 回答于 2018-08-17 10:34 举报

    一定要关联查询吗,二次查询怎么样。直接返回一个数

    3 条回复
    回复于 2018-08-17 10:40 回复

    二次查询然后再循环一次核对吗?
    这不是我想要的。。

    回复于 2018-08-17 11:48 回复

    第一次查询有a_id然后在页面使用模型如 Model::likeOut(a_id) 直接返回一个数字这不就行了,跟你的写法没太多区别 这是二次查询

    回复于 2018-08-17 16:23 回复
  • 回答于 2018-08-18 00:20 举报

    写一个 基类 model,重写 find 方法。BaseActiveQuery 继承yii\db\ActiveQuery 让所有model去继承,在BaseActiveQuery自己定义链式操作

    public static function find()
    {
        return Yii::createObject(BaseActiveQuery::className(), [get_called_class()]);
    }
    
您需要登录后才可以回答。登录 | 立即注册
数字派
总监

数字派 北京

注册时间:2016-04-19
最后登录:2023-03-07
在线时长:52小时34分
  • 粉丝10
  • 金钱1515
  • 威望10
  • 积分2135

热门问题