ホームページ > データベース > mysql チュートリアル > CakePHP の `find` メソッドで JOIN クエリを実行するにはどうすればよいですか?

CakePHP の `find` メソッドで JOIN クエリを実行するにはどうすればよいですか?

Susan Sarandon
リリース: 2025-01-04 13:47:39
オリジナル
210 人が閲覧しました

How to Perform JOIN Queries in CakePHP's `find` Method?

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

CakePHP では、find メソッドを使用して強力なデータベースクエリを実行できます。 JOIN クエリを実行するには、組み込みの包含機能を使用するか、カスタム結合を定義できます。

包含 (推奨)

包含を使用するには、定義する必要があります。モデル間の関係。たとえば、メッセージ モデルとユーザー モデルがある場合、モデル内で関連付けを宣言します。

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'
]);
ログイン後にコピー

カスタム結合

カスタムを定義したい場合

$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'
]);
ログイン後にコピー

カスタム結合を使用する場合、正しいフィールドが返されるようにするには、フィールド オプションを明示的に指定する必要があることに注意してください。

同じモデルに対する複数のリレーションシップの使用

別のアプローチは、同じモデルに対して複数のリレーションシップを作成することです。さまざまな関連付けのモデル。たとえば、メッセージの場合、送信メッセージには 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 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート