CakePHP での JOIN を使用したレコードの検索
CakePHP の find メソッドを使用して単一のクエリで複数のテーブルからデータを取得するには、さまざまなテクニックを使用できます。 。 1 つのアプローチは、シームレスなデータ取得のためにフレームワークの組み込みデータ関係と包含動作を利用することです。
CakePHP の方法
このアプローチには、モデルとモデル間の関係を定義することが含まれます。 Containable の動作を活用します。
class User extends AppModel { public $actsAs = array('Containable'); public $hasMany = array('Message'); } class Message extends AppModel { public $actsAs = array('Containable'); public $belongsTo = array('User'); }
のような関係を構成すると、find メソッドの contains パラメータを使用して関連レコードを取得できます:
$this->Message->find('all', array( 'contain' => array('User'), 'conditions' => array( 'Message.to' => 4 ), 'order' => 'Message.datetime DESC' ));
カスタム SQL 結合
あるいは、カスタム SQL 結合を定義して、テーブル間の特定の関係を指定することもできます。これは、より複雑なシナリオで役立つ場合があります。以下に例を示します。
$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' ));
この方法では、両方のテーブルから取得するフィールドを手動で指定する必要があることに注意してください。
同じモデルへの複数のリレーションシップの使用
複数のリレーションシップを介して同じテーブルからデータを取得する必要がある場合は、異なる別名を使用して複数のリレーションシップを定義できます。以下に例を示します:
class User extends AppModel { public $actsAs = array('Containable'); public $hasMany = array( 'MessagesSent' => array( 'className' => 'Message', 'foreignKey' => 'from' ) ); public $belongsTo = array( 'MessagesReceived' => array( 'className' => 'Message', 'foreignKey' => 'to' ) ); }
ここで、包含動作を使用して、これらの関係に関連するレコードを取得できます:
$this->Message->find('all', array( 'contain' => array('UserFrom'), 'conditions' => array( 'Message.to' => 4 ), 'order' => 'Message.datetime DESC' ));
これらの手法を使用すると、複数のデータから効率的にデータを取得できます。 CakePHP アプリケーション内のテーブル。
以上がCakePHP で JOIN を使用して複数のテーブルからデータを取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。