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 サイトの他の関連記事を参照してください。