【问题标题】:looking up table-join value from database with cakephp使用 cakephp 从数据库中查找表连接值
【发布时间】:2012-08-05 01:00:53
【问题描述】:

我正在尝试在 cakephp 的视图中访问用户名。我得到了一个用户 ID,我需要使用它来查找存储在不同表中的用户名。

我正在检索显示的表格是消息,如下所示

id |  title | message | from_user  | to_user | date

包含用户名的用户表

id | username | email | password

无论如何,我怎样才能在消息中查找 from_user 的用户名?我仍然习惯于蛋糕,所以我不知道如何在不实际编写查询的情况下做出“加入”语句。

我应该从控制器中的操作发送用户名还是可以从视图中执行此操作?

编辑-我让它工作了

这是我现在的索引函数

public function index() {

  $options['joins'] = array(
    array('table' => 'Users',
        'type' => 'inner',
            'fields' => array('user.username'),
        'conditions' => array(
            'Message.from_user = User.id',
            'alias' => 'user_id')
    )
);

$message = $this->Message->find('all', $options);

$this->set('messages', $message);
}

我将它添加到我的消息控制器中,现在会显示用户名,但仅适用于第一条消息。其他都是空白的。

public $belongsTo = array('User');

【问题讨论】:

    标签: php mysql cakephp


    【解决方案1】:

    你必须在消息模型中重新定义你的关系:

    public $belongsTo = array(
        'Sender' => array(
            'className' => 'User',
            'foreignKey' => 'from_user'
        ),
        'Recipient' => array(
            'className' => 'User',
            'foreignKey' => 'to_user'
        )
    );
    

    【讨论】:

    • 如果没有得到想要的结果,请告诉我。
    【解决方案2】:

    您可以使用可包含的行为来检索该记录。我所做的是将行为添加到 AppModel 并在 AppModel 中将递归设置为 -1。

    那么你的read() 电话会变成

    public function view($id) {
        $message = $this->Message->find('first', array(
            'conditions' => array('Message.id' => $id),
            'contain' => array(
                'FromUser' => array('fields' => array('FromUser.username')),
            ),
        ));
        $this->set('message', $message'); // or just $this->set(compact('message'));
    }
    

    在你看来:

    $message['FromUser']['username'];
    

    您也可以在视图或控制器中执行debug($message); 以查看变量内部的确切内容及其结构。

    假设您的关系设置正确,这应该检索与消息记录关联的 FromUser.username 字段。

    关于可收容的更多信息:http://book.cakephp.org/2.0/en/core-libraries/behaviors/containable.html (2.x) 和 http://book.cakephp.org/view/1323/Containable (1.3)

    【讨论】:

    • 如何访问该名称?我现在可以访问一些公共变量吗?
    • 我还是有点困惑。我是否将所有这些都放在 appModel 中?如果是这样,我是否创建一个名为 index 的函数(这是我在控制器中使用的名称)。
    • 您可以将行为添加到 AppModel,我的答案中的其余代码应该放在您的 public function view() 中,用您的 Message->read() 删除您现在拥有的内容并替换上面的代码
    • 我似乎无法弄清楚的唯一部分是如何处理使用 $id 的条件。由于这将查找 id 并且实际上并没有使用任何变量来执行此操作,因此 $id 设置为什么?因此,我遇到了一个错误。非常感谢您的帮助。
    • $id in public function view($id) 从 url 传递。前任。 /messages/view/4 会打电话给MessagesController::view(4)
    猜你喜欢
    • 2011-06-17
    • 2017-03-24
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-26
    相关资源
    最近更新 更多