ホームページ > データベース > mysql チュートリアル > CakePHP の find メソッドで JOIN を効率的に使用するにはどうすればよいですか?

CakePHP の find メソッドで JOIN を効率的に使用するにはどうすればよいですか?

Barbara Streisand
リリース: 2025-01-03 03:35:43
オリジナル
263 人が閲覧しました

How to Efficiently Use JOINs with CakePHP's find Method?

CakePHP の find メソッドでの JOIN の使用

CakePHP 2.x で JOIN を使用して複数のテーブルからデータを取得するには、2 つの方法を使用できます。

方法 1: CakePHP の方法(推奨)

  1. 関係を定義します:belongsTo および hasMany 関連付けを使用してモデル間の関係を作成します。

    • $actsAs を追加= ['コンテナ可能'];両方のモデルに追加して封じ込めを有効にします。
  2. メッセージ列を変更します: 関連付けと一致するように、messages.from をmessages.user_id に変更します。
  3. 検索メソッドを使用します: から次のクエリを実行します。 MessagesController:

    $this->Message->find('all', [
        'contain' => ['User'],
        'conditions' => ['Message.to' => 4],
        'order' => 'Message.datetime DESC'
    ]);
    ログイン後にコピー

方法 2: カスタム JOIN

  1. 結合を手動で定義する:検索で結合条件を直接指定します。

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

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

同じモデルに対して 2 つのリレーションシップを使用するには、別々のリレーションシップを定義できます。モデル内では次のようになります。

class User {
    ...
    public $belongsTo = ['MessagesReceived', 'MessagesSent'];
    ...
}

class Message {
    ...
    public $belongsTo = ['UserFrom', 'UserTo'];
    ...
}
ログイン後にコピー

その後、適切なメソッドを使用して find メソッドを使用できます。関係:

$this->Message->find('all', [
    'contain' => ['UserFrom'],
    'conditions' => ['Message.to' => 4],
    'order' => 'Message.datetime DESC'
]);
ログイン後にコピー

以上がCakePHP の find メソッドで JOIN を効率的に使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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