关于activerecord:yii2:无法从具有活动记录的两个表中获取数据

yii2 : can't get data from two table with active record

我要从两个表中获取数据:commentsuserscommentsusershasOne关系。

1
2
3
4
public function getUser()
    {
        return $this->hasOne(Users::className(), ['user_id' => 'user_id']);
    }

我想让comments.comment_idcomments.comment_contentcomments.user_idcomments表和uses.user_nameusers.user_display_nameusers表用于gridview小部件。

我用

1
2
3
4
5
6
7
8
9
10
11
$res = Comments::find()
            ->select([
                'comments.comment_id',
                'comments.comment_content',
                'comments.user_id',
                'users.user_id',
                'users.user_display_name',
                'users.user_name',
            ])
            ->innerJoinWith('user')
            ->all();

此代码获取comments字段,但无法从数据库获取users.user_nameusers.user_display_name

我该怎么做?

注意:数据库中的用户表是users,但是当我用gii创建模型时,relation方法声明为getUser()时,我不知道为什么。

更新1:

comments表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
DROP TABLE IF EXISTS `comments`;
CREATE TABLE `comments` (
  `comment_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `comment_content` text NOT NULL,
  `comment_approved` enum('no','yes') NOT NULL DEFAULT 'no',
  `comment_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `comment_parent` bigint(20) unsigned NOT NULL DEFAULT '0',
  `sms_id` bigint(20) unsigned NOT NULL DEFAULT '0',
  `user_id` bigint(20) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`comment_id`),
  KEY `fk_comment_sms_id` (`sms_id`),
  KEY `fk_commetn_user_id` (`user_id`),
  CONSTRAINT `fk_comment_sms_id` FOREIGN KEY (`sms_id`) REFERENCES `sms` (`sms_id`),
  CONSTRAINT `fk_commetn_user_id` FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8;

users表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CREATE TABLE `users` (
  `user_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `user_name` varchar(60) NOT NULL DEFAULT '',
  `user_pass` varchar(64) NOT NULL DEFAULT '',
  `user_level` int(11) NOT NULL DEFAULT '1',
  `user_email` varchar(100) NOT NULL DEFAULT '',
  `user_display_name` varchar(250) NOT NULL DEFAULT '',
  `user_phone_number` varchar(11) NOT NULL,
  `user_registered` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `user_activation_key` varchar(60) NOT NULL,
  `user_status` enum('active','deactive','delete') NOT NULL DEFAULT 'deactive',
  PRIMARY KEY (`user_id`),
  UNIQUE KEY `u_user_sign` (`user_name`) USING BTREE,
  UNIQUE KEY `u_user_email` (`user_email`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=24 DEFAULT CHARSET=utf8;


不确定查询是否返回了任何数据,您将如何显示或测试,但您应该阅读yii中的关系。

使用关系数据
懒惰而急切的装载

在延迟加载的情况下,数据在您尝试访问之前不存在,因此可能不会出现在诸如print_rvar_dump之类的内容中。


我建议您将表重命名为commentuser。阅读这里:表命名困境:单数与复数名称为什么要使用单数名称。

gii生成getUser而不是getUsers的原因是hasOne关系。它只有一个用户,而不是多个用户-

您确定关系定义正确吗?user_id是用户表中的pk还是评论表中的fk?你确定数据库中有正确的数据吗?