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