【问题标题】:yii2 : can't get data from two table with active recordyii2:无法从两个具有活动记录的表中获取数据
【发布时间】:2015-01-01 19:07:51
【问题描述】:

我想从两个表中获取数据comments,users
commentshasOne 有关系users

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

我想从comments 表和uses.user_name 中获取comments.comment_id,comments.comment_content,comments.user_idusers.user_display_nameusers 表中使用gridview 小部件。

我用

$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_name,users.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;

【问题讨论】:

  • 你是如何使用$res来显示数据的?
  • $res 是模型对象(我认为),我使用foreach($res as $comment),然后使用字段名称获取值,例如:$comment->comment_content。小部件自动使用它。
  • $comment->user->user_name你有什么收获
  • 是的 :),你 @Alex.it 的工作

标签: activerecord yii2


【解决方案1】:

不确定查询是否返回任何数据,但您应该阅读 Yii 中的关系。

Working with Relational Data
Lazy and Eager Loading

通过延迟加载,数据在您尝试访问之前不存在,因此可能不会出现在 print_rvar_dump 等内容中

【讨论】:

  • 我使用 xdebug 和 var_dump 查看结果,var_dump 有限制显示结果(我已修复)。
【解决方案2】:

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

Gii 生成getUser 而不是getUsers 的原因是hasOne 关系。它得到一个 -user- 而不是多个 -users-

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

【讨论】:

  • 更新表查询,我使用navicat在db中输入数据,我确定db中有正确的数据
  • 如果您在 foreach 中执行 print_r($comment),您会看到 user_name 和 user_user_display_name 吗?
  • 我在上面使用了@Alex 帮助,它的工作。使用$comment->user->user_name
猜你喜欢
  • 1970-01-01
  • 2019-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-17
  • 2017-10-20
相关资源
最近更新 更多