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'); }
使用注意事项
- 记得把代码里的
content和score替换成你数据库中实际的评论内容字段、评分字段名称; - 调用时,通过
$user->commentAndRate获取所有关联数据集,遍历每个元素就能用$item->comment和$item->rate访问对应数据; - 如果存在「只有评论没有评分」或者「只有评分没有评论」的场景,可以把
leftJoin改成rightJoin或者fullJoin来适配你的业务需求。
内容的提问来源于stack exchange,提问作者Nagibaba
相关产品推荐
相关产品推荐

