You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Yii2:如何将用户的两个关联关系基于announce_id合并为一个?

合并User模型中两个关联关系的解决方案

嘿,我懂你想要的效果!就是把User模型里的getAnnounceComments和getAnnounceRates这两个关联,基于相同的announce_id合并成一个统一的关联,方便用$user->commentAndRate拿到数据后直接调用comment和rate属性对吧?这就给你具体的实现方案!

核心思路

通过自定义关联查询,把AnnounceComment和AnnounceRate两张表基于announce_id+user_id做关联,返回包含评论、评分的联合数据集,这样就能通过统一的关联属性访问两种数据了。

具体实现代码

在你的User模型中添加以下方法:

public function getCommentAndRate()
{
    // 先构建评论表的基础查询,锁定当前用户的数据
    $commentBaseQuery = AnnounceComment::find()
        ->where(['user_id' => $this->id]);

    // 定义合并后的关联,通过左连接关联评分表
    return $this->hasMany(AnnounceComment::className(), ['user_id' => 'id'])
        ->select([
            'announce_id',
            'comment.content AS comment', // 替换成你实际的评论内容字段名
            'rate.score AS rate'         // 替换成你实际的评分字段名
        ])
        ->from(['comment' => $commentBaseQuery])
        // 按announce_id和user_id关联评分表
        ->leftJoin(
            'announce_rate AS rate',
            'rate.announce_id = comment.announce_id AND rate.user_id = comment.user_id'
        )
        // 按announce_id分组,避免同一条announce的重复数据
        ->groupBy('announce_id');
}

使用注意事项

  1. 记得把代码里的content和score替换成你数据库中实际的评论内容字段、评分字段名称;
  2. 调用时,通过$user->commentAndRate获取所有关联数据集,遍历每个元素就能用$item->comment和$item->rate访问对应数据;
  3. 如果存在「只有评论没有评分」或者「只有评分没有评论」的场景,可以把leftJoin改成rightJoin或者fullJoin来适配你的业务需求。

内容的提问来源于stack exchange,提问作者Nagibaba

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:55:54