gpt4 book ai didi

php - CakePHP 使用 JOIN 查找方法

转载 作者:IT王子 更新时间:2023-10-29 00:00:39 36 4
gpt4 key购买 nike

嗨,

我需要使用 CakePHP 的 find 方法进行以下查询:

SELECT *
FROM `messages`
INNER JOIN users ON messages.from = users.id
WHERE messages.to = 4
ORDER BY messages.datetime DESC

基本上我有:

  • messages 表与 Message 模型
  • users 表与 User 模型

并希望在一个查询中从两个表中检索信息。 users.id 字段与 messages.from 字段相同,所以这就是连接所在。

我在我的 MessagesController 中这样做,所以它需要是这样的:

$this->Message->find();

谢谢

最佳答案

有两种主要方法可以做到这一点。其中一种是标准的 CakePHP 方式,另一种是使用自定义连接。

值得指出的是,此建议适用于 CakePHP 2.x,而不是 3.x。

CakePHP 方式

您将创建与您的用户模型和消息模型的关系,并使用可包含的行为:

class User extends AppModel {
public $actsAs = array('Containable');
public $hasMany = array('Message');
}

class Message extends AppModel {
public $actsAs = array('Containable');
public $belongsTo = array('User');
}

您需要将 messages.from 列更改为 messages.user_id 以便 cake 可以自动为您关联记录。

然后您可以从消息 Controller 中执行此操作:

$this->Message->find('all', array(
'contain' => array('User')
'conditions' => array(
'Message.to' => 4
),
'order' => 'Message.datetime DESC'
));

(其他)CakePHP 方式

我建议使用第一种方法,因为它会为您节省大量时间和工作量。第一种方法还为建立关系奠定了基础,该关系可用于除您现在需要的之外的任意数量的其他查找调用和条件。但是,cakePHP 确实支持定义您自己的连接的语法。从 MessagesController:

会这样完成
$this->Message->find('all', array(
'joins' => array(
array(
'table' => 'users',
'alias' => 'UserJoin',
'type' => 'INNER',
'conditions' => array(
'UserJoin.id = Message.from'
)
)
),
'conditions' => array(
'Message.to' => 4
),
'fields' => array('UserJoin.*', 'Message.*'),
'order' => 'Message.datetime DESC'
));

注意,在本示例中,我已将字段名称 messages.from 与您当前的表相同。

对同一个模型使用两个关系

下面是第一个示例如何使用同一个模型的两个关系:

class User extends AppModel {
public $actsAs = array('Containable');
public $hasMany = array(
'MessagesSent' => array(
'className' => 'Message',
'foreignKey' => 'from'
)
);
public $belongsTo = array(
'MessagesReceived' => array(
'className' => 'Message',
'foreignKey' => 'to'
)
);
}

class Message extends AppModel {
public $actsAs = array('Containable');
public $belongsTo = array(
'UserFrom' => array(
'className' => 'User',
'foreignKey' => 'from'
)
);
public $hasMany = array(
'UserTo' => array(
'className' => 'User',
'foreignKey' => 'to'
)
);
}

现在您可以像这样进行查找调用:

$this->Message->find('all', array(
'contain' => array('UserFrom')
'conditions' => array(
'Message.to' => 4
),
'order' => 'Message.datetime DESC'
));

关于php - CakePHP 使用 JOIN 查找方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5079908/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com