join通常有下面幾種類型,不同類型的join操作會影響返回的數(shù)據(jù)結(jié)果。

  • INNER JOIN: 等同于 JOIN(默認(rèn)的JOIN類型),如果表中有至少一個(gè)匹配,則返回行
  • LEFT JOIN: 即使右表中沒有匹配,也從左表返回所有的行
  • RIGHT JOIN: 即使左表中沒有匹配,也從右表返回所有的行
  • FULL JOIN: 只要其中一個(gè)表中存在匹配,就返回行

說明

object join ( mixed join [, mixed $condition = null [, string $type = 'INNER']] )

JOIN方法也是連貫操作方法之一,用于根據(jù)兩個(gè)或多個(gè)表中的列之間的關(guān)系,從這些表中查詢數(shù)據(jù)。

參數(shù)


join

要關(guān)聯(lián)的(完整)表名以及別名

支持三種寫法:

寫法1:[ '完整表名或者子查詢'=>'別名' ]
寫法2'完整表名 別名'
寫法3'不帶數(shù)據(jù)表前綴的表名'

condition

關(guān)聯(lián)條件??梢詾樽址驍?shù)組, 為數(shù)組時(shí)每一個(gè)元素都是一個(gè)關(guān)聯(lián)條件。

type

關(guān)聯(lián)類型。可以為:INNER、LEFT、RIGHT、FULL,不區(qū)分大小寫,默認(rèn)為INNER。

返回值
模型對象

舉例


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__在最終解析的時(shí)候會轉(zhuǎn)換為 think_work和 think_card。注意:'_表名_'這種方式中間的表名需要用大寫

如果不想使用別名,后面的條件就要使用表全名,可以使用下面這種方式

Db::table('think_user')->join('__WORK__','__ARTIST__.id = __WORK__.artist_id')->select();

默認(rèn)采用INNER JOIN 方式,如果需要用其他的JOIN方式,可以改成

Db::table('think_user')->alias('a')->join('word w','a.id = w.artist_id','RIGHT')->select();

表名也可以是一個(gè)子查詢

$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返回的語句帶有(),所以這里不需要在兩端再加上()。