「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > CakePHP の find メソッドを使用して結合クエリを実行するにはどうすればよいですか?

CakePHP の find メソッドを使用して結合クエリを実行するにはどうすればよいですか?

2024 年 11 月 2 日に公開
ブラウズ:695

How to Perform a Join Query with CakePHP\'s find Method?

CakePHP の JOIN を使用した Find メソッド

この質問では、CakePHP の find を使用して、2 つのテーブル、メッセージ、ユーザーを結合するクエリを実行する方法を検討します。方法。具体的には、messages.from フィールドが users.id フィールドに等しく、messages.to フィールドが 4 に等しいという条件に基づいて、両方のテーブルから情報を取得する必要があります。

主なフィールドは 2 つあります。 CakePHP でこの結合を実現するための方法: 標準の CakePHP 方法とカスタム結合の使用。

標準 CakePHP 方法

推奨されるアプローチは、CakePHP の標準方法を使用することです。これには、モデル間の関係を作成し、包含可能な動作を使用することが含まれます。方法は次のとおりです:

  1. ユーザー モデルとメッセージ モデルの関係を定義します:

    class User extends AppModel {
     public $actsAs = array('Containable');
     public $hasMany = array('Message');
    }
    
    class Message extends AppModel {
     public $actsAs = array('Containable');
     public $belongsTo = array('User');
    }
  2. 関係に基づいた自動関連付けを容易にするために、messages.from 列の名前をmessages.user_idに変更します。
  3. 次の検索クエリを実行します:

    $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'
));
リリースステートメント この記事は次の場所に転載されています: 1729175782 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3