在thinkphp5中,join用于根據兩個或者多個表中列之間的關系,從這些表中查詢數據,是連貫操作方法之一,返回的結果是一個模型對象,語法為“join ( 要關聯的表名以及別名 [ 關聯條件 [ 關聯類型]] )”。
本文操作環境:Windows10系統、thinkphp5版、Dell G3電腦。
thinkphp5中join的用法是什么
JOIN方法也是連貫操作方法之一,用于根據兩個或多個表中的列之間的關系,從這些表中查詢數據。
說明
object?join?(?mixed?join?[,?mixed?$condition?=?null?[,?string?$type?=?'INNER']]?)
參數
立即學習“PHP免費學習筆記(深入)”;
join:要關聯的(完整)表名以及別名,支持三種寫法:
-
寫法1:[ ‘完整表名或者子查詢’=>’別名’ ]
-
寫法2:’完整表名 別名’
-
寫法3:’不帶數據表前綴的表名’
condition:關聯條件。可以為字符串或數組, 為數組時每一個元素都是一個關聯條件。
type:關聯類型。可以為:INNER、LEFT、RIGHT、FULL,不區分大小寫,默認為INNER。
返回值:模型對象
join通常有下面幾種類型,不同類型的join操作會影響返回的數據結果。
-
INNER JOIN: 等同于 JOIN(默認的JOIN類型),如果表中有至少一個匹配,則返回行
-
LEFT JOIN: 即使右表中沒有匹配,也從左表返回所有的行
-
RIGHT JOIN: 即使左表中沒有匹配,也從右表返回所有的行
-
FULL JOIN: 只要其中一個表中存在匹配,就返回行
示例如下:
Db::table('think_artist') ->alias('a') ->join('think_work?w','a.id?=?w.artist_id') ->join('think_card?c','a.card_id?=?c.id') ->select();
Db::table('think_artist') ->alias('a') ->join('__WORK__?w','a.id?=?w.artist_id') ->join('__CARD__?c','a.card_id?=?c.id') ->select();
$join?=?[ ????['think_work?w','a.id=w.artist_id'], ????['think_card?c','a.card_id=c.id'], ]; Db::table('think_user')->alias('a')->join($join)->select();
以上三種寫法的效果一樣,__WORK__和 __CARD__在最終解析的時候會轉換為 think_work和 think_card。注意:’_表名_’這種方式中間的表名需要用大寫
如果不想使用別名,后面的條件就要使用表全名,可以使用下面這種方式
Db::table('think_user')->join('__WORK__','__ARTIST__.id?=?__WORK__.artist_id')->select();
默認采用INNER JOIN 方式,如果需要用其他的JOIN方式,可以改成
Db::table('think_user')->alias('a')->join('word?w','a.id?=?w.artist_id','RIGHT')->select();
表名也可以是一個子查詢
$subsql?=?Db::table('think_work')->where(['status'=>1])->field('artist_id,count(id)?count')->group('artist_id')->buildSql(); Db::table('think_user')->alias('a')->join([$subsql=>?'w'],?'a.artist_id?=?w.artist_id')->select();
因buildSql返回的語句帶有(),所以這里不需要在兩端再加上()。
推薦學習:《PHP視頻教程》