CakePHP 中使用 JOIN 的 Find Method
这个问题探讨了如何使用 CakePHP 的 find 来执行连接两个表、消息和用户的查询方法。具体来说,我们需要根据 messages.from 字段等于 users.id 字段、messages.to 字段等于 4 的条件从两个表中检索信息。
主要有两个在 CakePHP 中实现此连接的方法:标准 CakePHP 方式和使用自定义连接。
标准 CakePHP 方式
推荐的方法是使用 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'); }
执行以下查找查询:
$this->Message->find('all', array( 'contain' => array('User'), 'conditions' => array( 'Message.to' => 4 ), 'order' => 'Message.datetime DESC' ));
自定义联接
或者,您可以在查找查询中使用自定义联接:
$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' ));
在此自定义联接中,我们显式定义联接条件并选择要返回的字段。
使用同一模型的两个关系
如果您希望与同一个模型建立两个关系,可以如下定义它们:
class User extends AppModel { public $actsAs = array('Containable'); public $hasMany = array( 'MessagesSent' => array( 'className' => 'Message', 'foreignKey' => 'from' ), 'MessagesReceived' => array( 'className' => 'Message', 'foreignKey' => 'to' ) ); } class Message extends AppModel { public $actsAs = array('Containable'); public $belongsTo = array( 'UserFrom' => array( 'className' => 'User', 'foreignKey' => 'from' ), 'UserTo' => array( 'className' => 'User', 'foreignKey' => 'to' ) ); }
定义了这些关系后,您可以使用如下查找查询:
$this->Message->find('all', array( 'contain' => array('UserFrom'), 'conditions' => array( 'Message.to' => 4 ), 'order' => 'Message.datetime DESC' ));
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3