ThinkPHP の関数クラスのテーブル結合クエリ

導入

ネイティブ 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('别名');//辅助方法之一

おすすめ

転載: blog.csdn.net/wangxuanyang_zer/article/details/129929821