導入
ネイティブ SQL ではデータ結合テーブル クエリに結合構文が使用されますが、ThinkPHP では結合テーブル クエリ操作をサポートしていますが、これはテーブル方式と結合方式の 2 つの方法に要約できます。
1 つ目はテーブル メソッドです。TP の SQL プロトタイプに対応します。
ネイティブ PHP メソッド: where 構文を使用してテーブル 1 とテーブル 2 を関連付けます。つまり、2 つのテーブルを関連付けます。
select 表1.字段,表2.字段 [as 关联查询出的字段名] from 表1[as 别名1],表2[as 别名2] where 表1.字段=表2.字段
ThinkPHP のカプセル化の方法:
$model->table(); //table方法是连贯操作中的一个辅助方法
ケース: 各従業員のすべての情報を照会する
分析: 従業員情報に dept_id フィールドがあり、これが部門テーブルの主キーであるためです。したがって、ここでは部門の名前を読む必要があります。そのため、部門テーブルを関連付ける必要があり、関連付け条件は従業員テーブルのdept_id = 部門テーブルのidとなります。
データテーブル: 従業員テーブル sp_user、部門テーブル sp_dept
マスターテーブルとスレーブテーブルの決定:マスターテーブル sp_user (エイリアス t1)、スレーブテーブル sp_dept (エイリアス t2)
文法:
select t1.*,t2.name as deptname from sp_user as t1,sp_dept as t2 where t1.dept_id=t2.id;
Navicate での実行結果
クエリ効果を実現するには、上記のコードを TP に実装します。
① 方法 1:ネイティブ SQL ステートメントを通じて実行する
//原生SQL方法实现联表查询
public function test(){
//实例化模型
$model = M();//执行原生sql语句可以不用关联表,因为sql里进行了关联
//定义sql语句
$sql="select t1.*,t2.name as deptname from sp_user as t1,sp_dept as t2 where t1.dept_id=t2.id;";
$result = $model -> query($sql);
dump($result);die;
}
②方法2:テーブル法を使って実現する
$model->table('表名1[as 别名1],表名2[as 别名2]......'); //table方法是连贯操作中的一个辅助方法
テーブル メソッドを使用すると、モデルはテーブル メソッドで指定されたデータ テーブルに自動的に関連付けられます。次に、テーブル メソッドを使用して前のネイティブ SQL を書き換えます。
/table方法实现联表查询
public function test(){
//实例化模型
$model = M();//直接实例化父类即可,不需要关联数据表!!!
// 连贯操作,这里我为了可读性,将代码分行,分不分行都可以
$result = $model->field('t1.*,t2.name as deptname')
->table('sp_user as t1,sp_dept as t2')
->where('t1.dept_id = t2.id')
->select();
dump($result);die;
}
オインメソッド
JOIN メソッドは、複数のテーブルの列間の関係に基づいて 2 つ以上のテーブルのデータをクエリするために使用される一貫した操作メソッドの 1 つでもあります。
通常、結合には次のタイプがあり、異なるタイプの結合操作は返されるデータ結果に影響します。
- INNER JOIN: JOIN (デフォルトの JOIN タイプ) と同等で、テーブル内に少なくとも 1 つの一致がある場合に行を返します。
- LEFT JOIN: 右側のテーブルに一致するものがない場合でも、左側のテーブルからすべての行を返します。
- RIGHT JOIN: 左側のテーブルに一致するものがない場合でも、右側のテーブルからすべての行を返します。
- FULL JOIN: いずれかのテーブルに一致が存在する限り行を返します。
-
一般的なタイプ:
内部結合: インライン;
LEFT JOIN (左外側左メイン) および RIGHT JOIN (右外側右メイン): 外部接続。
ネイティブ SQL の結合構文
select 表1.字段,表2.字段 from 表1[as 别名1] [inner/left/right/full]join 表2[as 别名2] on 表1.字段=表2.字段;
例: 部門の詳細情報を問い合わせ、各部門情報の pid に対応する部門名をリストします。
分析: マスターテーブル sp_dept (エイリアス t1)、スレーブテーブル sp_dept (エイリアス t2)
条件: t1.pid = t2.id
①ネイティブSQL方式:
select t1.*,t2.name as deptname from sp_dept as t1 left join sp_dept as t2 on t1.pid=t2.id;
Navicatの実行結果:ここでは上位部門が表示されます。人材部がpid0の最上位部門、技術部門は財務部の管理下にあるためpidが2、財務部と外務省が表示されます。事務は人材省の管理下にあるため、pid は 1 です。
②ThinkPHPで結合構文を実行します。
on によって関連付けられた join メソッドも、コヒーレント操作の補助メソッドの 1 つであり、パラメーターは 1 つだけです。
$model->join('联表方式 join 表名[as 表名1] on 表1.字段=表2.字段');
現在のモデルに関連付けられたテーブルに別名を付ける必要がある場合は、別名メソッドを使用できます。
$model->alias('别名');//辅助方法之一