2014-11-05 60 views
3

我想要從兩個表中獲取數據comments,users
commentsusersyii2:無法從兩個有活動記錄的表中獲取數據

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

我想從comments表和uses.user_namecomments.comment_idcomments.comment_contentcomments.user_id得到,users.user_display_nameusershasOne關係在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_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

數據? – Alex 2014-11-05 15:15:11

+1

$ res是模型對象(我認爲),我使用'foreach($ res作爲$ comment)',然後通過字段名稱獲得值:'$ comment-> comment_content'。小部件自動使用它。 – 123 2014-11-05 15:17:46

+2

你有沒有得到'$ comment-> user-> user_name' – Alex 2014-11-05 15:22:52

回答

3

不知道你如何顯示或測試查詢是否返回任何數據,但你應該閱讀Yii中的關係。

Working with Relational Data
Lazy and Eager Loading

隨着延遲加載你如何使用`$ res`顯示的數據不存在,直到您嘗試訪問它,可能不會出現在之類的東西print_rvar_dump

+1

我使用xdebug和'var_dump'來查看結果,'var_dump'有限制結果(我修正了它)。 – 123 2014-11-05 15:56:07

2

我建議重新命名錶來commentuser。在這裏閱讀:Table Naming Dilemma: Singular vs. Plural Names爲什麼你應該使用單數名稱。

Gii生成getUser而不是的原因是因爲hasOne的關係。它得到一個用戶 - 而不是多個 - 用戶s -

您確定關係定義是否正確?用戶表中的PK和評論表中的FK是user_id?你確定數據庫中有正確的數據嗎?

+1

更新表查詢,我用navicat輸入數據在db中,我確定數據庫中有正確的數據 – 123 2014-11-05 15:03:41

+1

如果你在你的foreach做一個'print_r($ comment)',你會看到user_name和user_user_display_name ? – jagsler 2014-11-05 15:21:22

+1

我在上面使用了@Alex幫助,並且它的工作。使用'$ comment-> user-> user_name'。 – 123 2014-11-05 15:31:53