CakePHP の JOIN を使用した Find メソッド
この質問では、CakePHP の find を使用して、2 つのテーブル、メッセージ、ユーザーを結合するクエリを実行する方法を検討します。方法。具体的には、messages.from フィールドが users.id フィールドに等しく、messages.to フィールドが 4 に等しいという条件に基づいて、両方のテーブルから情報を取得する必要があります。
主なフィールドは 2 つあります。 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' ));
このカスタム結合では、結合条件を明示的に定義し、返されるフィールドを選択します。
同じモデルへの 2 つのリレーションシップの使用
同じモデルに対して 2 つの関係を確立したい場合は、次のように定義できます。
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