在 CakePHP 中,find 方法允许强大的数据库查询。要执行 JOIN 查询,您可以使用内置包含功能或定义自定义联接。
包含(推荐)
要使用包含,您必须定义模型之间的关系。例如,如果您有一个 Message 模型和一个 User 模型,您将在模型中声明关联:
class User extends AppModel { public $hasMany = ['Message']; } class Message extends AppModel { public $belongsTo = ['User']; }
设置这些关系后,您可以通过在查找中包含 contains 来执行 JOIN 查询方法调用:
$messages = $this->Message->find('all', [ 'contain' => ['User'], 'conditions' => ['Message.to' => 4], 'order' => 'Message.datetime DESC' ]);
自定义连接
如果您更喜欢定义自定义连接,您可以在 find 方法调用中使用 joins 选项:
$messages = $this->Message->find('all', [ 'joins' => [ [ 'table' => 'users', 'alias' => 'UserJoin', 'type' => 'INNER', 'conditions' => ['UserJoin.id = Message.from'] ] ], 'conditions' => ['Message.to' => 4], 'fields' => ['UserJoin.*', 'Message.*'], 'order' => 'Message.datetime DESC' ]);
请注意,在使用自定义连接时,您需要显式指定 fields 选项,以确保返回正确的字段。
使用与同一模型的多个关系
另一种方法是为同一模型创建多个关系不同的协会。例如,对于消息,您可以为传出消息建立 MessageSent 关系,为传入消息建立 MessageReceived 关系:
class User extends AppModel { public $hasMany = [ 'MessagesSent' => ['className' => 'Message', 'foreignKey' => 'from'], 'MessagesReceived' => ['className' => 'Message', 'foreignKey' => 'to'] ]; } class Message extends AppModel { public $belongsTo = [ 'UserFrom' => ['className' => 'User', 'foreignKey' => 'from'], 'UserTo' => ['className' => 'User', 'foreignKey' => 'to'] ]; }
使用这些关系,您可以执行 JOIN 查询,如下所示:
$messages = $this->Message->find('all', [ 'contain' => ['UserFrom'], 'conditions' => ['Message.to' => 4], 'order' => 'Message.datetime DESC' ]);
以上是如何在 CakePHP 的'find”方法中执行 JOIN 查询?的详细内容。更多信息请关注PHP中文网其他相关文章!