【问题标题】:CakePHP trouble linking data from 2 tables in modelsCakePHP 无法链接模型中 2 个表中的数据
【发布时间】:2014-06-10 13:48:29
【问题描述】:

我无法在使用 cakePHP 的聊天视图中链接来自表用户的名字等数据。下面是我的代码,无论我做什么,脚本都不会从聊天数据库表中选择 user_id 来显示名字。我必须监督一些事情,但我正在考虑的循环让我有些头疼。有人可以让我摆脱这个循环吗?

用户.php

<?php
class User extends AppModel {
    public $hasMany = array(
        'Ondutylog',
        'Chat'
        );
}
?>

聊天.php

<?php
class Chat extends AppModel {
    public $belongsTo = array(
        'User'
        );
}
?>

ChatsController.php

<?php
class ChatsController extends AppController {
    var $uses = array('User', 'Chat');
    public function view() {
        $chats = $this->Chat->find('all', array(
            'order' => array('id' => 'ASC'),
            'recursive' => -1
            ));
        $this->set('chats', $chats);
        $id = $chats['Chat']['user_id'];
        $userdetails = $this->Chat->User->find('first', array(
            'conditions' => array(
                'id' => $id
                ),
            recursive' => -1
            ));
        return $userdetails;
    }
}
?>

view.ctp

<?php 
foreach($chats as $chat) :
    echo "<tr>";
    echo "<td>".$userdetails['User']['firstname']."</td>";
    echo "<td>".$chat['Chat']['user_id']."</td>";
    echo "<td>".$chat['Chat']['text']."</td>";
    echo "<td>".$chat['Chat']['created']."</td>";
    echo "</tr>";
endforeach 
?>

我在 $chats 中返回的数组

[Chat] => Array
    (
        [id] => 1
        [user_id] => 11
        [text] => hello
        [created] => 2014-05-21 19:56:16
        [modified] => 2014-05-21 19:56:16
    )

【问题讨论】:

    标签: php mysql cakephp


    【解决方案1】:

    改变

    return $userdetails;
    

    $this->set(compact('userDetails'));
    

    你应该设置视图变量不返回信息。

    虽然你为什么要单独查询它而不是只使用'recursive' =&gt; 0,它会通过表连接获取关联的用户记录,你可以在视图中使用$chat['User']['firstname']

    同时摆脱var $uses = array('User', 'Chat');。这不是必需的。 $this-&gt;Chat 已经可用,并且用户模型通过关联访问为$this-&gt;Chat-&gt;User,正如您已经完成的那样。

    【讨论】:

    • 当我按照您回复的最后一部分进行操作时,我得到:SQL 查询:SELECT Chat.id, Chat.user_id, Chat.text, @987654334 @.created, Chat.modified, User.id, User.firstname, User.lastname, @98765434@, User, @9876 passwordUserpasswordresetUserpictureUsercompanyUseradminroleUserondutyUserlastlogincreatedcreatedUser。 @ = User.id) 其中 1 = 1 由id ASC 订购
    • 如果我使用 $this->set(compact('userDetails'));我将如何使用返回的详细信息?
    • 我相信你可以自己弄清楚如何使用数组:)
    • 对不起,在这种情况下我不能,因为数组返回正常,除了它没有从用户表中找到匹配的数组
    【解决方案2】:

    您需要在控制器中为模型充电

    class ChatsController extends AppController {
    
        public function view() {
            $this->loadModel('User');
            $this->loadModel('Chat');
            $chats = $this->Chat->find('all', array(
                'order' => array('id' => 'ASC'),
                'recursive' => -1
                ));
            $this->set('chats', $chats);
            $id = $chats['Chat']['user_id'];
            $userdetails = $this->Chat->User->find('first', array(
                'conditions' => array(
                    'id' => $id
                    ),
                recursive => -1
                ));
           $this->set(compact('userDetails'));  
        }
    }
    

    【讨论】:

    • 错误:语法错误,意外的 '$this' (T_VARIABLE),期待 loadModule 行的函数 (T_FUNCTION)
    • 试过这个,但不能让它工作:(在未定义的索引$id中出错
    • $id = $chats['Chat']['user_id'];
    • 嗨 Widrogo,我已经用 $chats 中返回的数组更新了问题
    • 好吧,我看不出问题,因为你正在使用你需要 foreach 的数据数组来获得聊天的价值,但应该是这样 $id= $chats[0]['Chat ']['用户身份']; -> 如果你想要数组中的第一个 id,但是我看不到数组数据的编号以获得第一个值
    【解决方案3】:

    我找到了解决方案,它比我自己想象的更接近。因为模型用户和聊天已经加入,我只需要在控制器中使用几行。所以我这样修改:

    public function view() {
        $chats = $this->Chat->find('all');
        $this->set('chats', $chats);
    }
    

    仅此而已……

    【讨论】:

      猜你喜欢
      • 2020-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多