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

时间:2014-11-05 14:36:38

标签: activerecord yii2

我希望从两个表commentsusers获取数据 commentshasOne

users的关系
public function getUser()
    {
        return $this->hasOne(Users::className(), ['user_id' => 'user_id']);
    }

我希望从comments.comment_id表格中获取comments.comment_contentcomments.user_idcomments,从uses.user_name表格中users.user_display_nameusersgridview小部件中使用。

我用

$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创建模型时,关系方法声明为getUser(),我不知道为什么。

更新1:

comments表:

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表:

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;

2 个答案:

答案 0 :(得分:3)

如果查询返回了任何数据,你不知道如何显示或测试,但你应该阅读Yii中的关系。

Working with Relational Data
Lazy and Eager Loading

延迟加载数据在您尝试访问之前不会存在,因此可能不会显示在print_rvar_dump

之类的内容中

答案 1 :(得分:2)

我建议您将表重命名为commentuser。请阅读此处:Table Naming Dilemma: Singular vs. Plural Names为什么要使用单数名称。

Gii生成getUser而非getUsers的原因是hasOne关系。它获得一个用户而不是多个用户 s -

您确定关系定义是否正确?是user_id用户表中的PK和评论表中的FK吗?你确定数据库中有正确的数据吗?