1. 程式人生 > >Laravel框架學習(資料庫高階查詢)

Laravel框架學習(資料庫高階查詢)

1、連線查詢(join)

連線查詢指的是將兩張表或多張表關聯到一起進行查詢,獲取一個表的行與另一個表的行匹配的資料。常見的連線查詢包括內連線(等值連線)、左(外)連線、右(外)連線和交叉連線(完全連線)等。
我們將使用者表users和文章表posts關聯到一起進行查詢,在此之前,我們先建立posts表,其欄位及初始值如下:
這裡寫圖片描述
其中user_id對應users表中的使用者id。

1.1 內連線

內連線用於獲取兩張表結果集的交集部分,我們可以使用查詢構建器的join方法進行內連線查詢:

$users = DB::table('users')->join('posts','users.id'
,'=','posts.user_id')
->
get(); dd($users);

顯示結果如下:

array:3 [▼
  0 => {#226 ▼
    +"id": 1
    +"name": "Laravel"
    +"email": "[email protected]"
    +"password": "123"
    +"remember_token": "x"
    +"created_at": "0000-00-00 00:00:00"
    +"updated_at": "0000-00-00 00:00:00"
    +"title": "test1"
    +"content": "test1"
+"user_id": 1 } 1 => {#227 ▼ +"id": 2 +"name": "Laravel" +"email": "[email protected]" +"password": "123" +"remember_token": "x" +"created_at": "0000-00-00 00:00:00" +"updated_at": "0000-00-00 00:00:00" +"title": "test2" +"content": "test2" +"user_id": 1 } 2 => {#228 ▼
+"id": 3 +"name": "Academy" +"email": "[email protected]" +"password": "123" +"remember_token": "y" +"created_at": "0000-00-00 00:00:00" +"updated_at": "0000-00-00 00:00:00" +"title": "test3" +"content": "test3" +"user_id": 2 } ]

1.2 左連線

左連線的結果集指定的左表的所有行,如果左表的某行在右表中沒有匹配行,則在相關聯的結果集行中右表的所有選擇列表列均為空值(null)。我們使用查詢構建器的leftJoin方法進行左連線查詢:

$users = DB::table('users')->leftJoin('posts','users.id','=','posts.user_id')->get();
dd($users);
array:4 [▼
  0 => {#226 ▶}
  1 => {#227 ▶}
  2 => {#228 ▶}
  3 => {#229 ▼
    +"id": null
    +"name": "test3"
    +"email": "[email protected]"
    +"password": "123456"
    +"remember_token": "z"
    +"created_at": null
    +"updated_at": null
    +"title": null
    +"content": null
    +"user_id": null
  }
]

1.3 更加複雜的連線查詢

很多時候,連線查詢的查詢條件往往更為複雜,並不是一個簡單的join/leftJoin方法就能搞定的,那麼我們如何新增更加複雜的查詢條件呢?使用JoinClause代替條件引數:

$users = DB::table('users')->join('posts',function($join){
    $join->on('users.id','=','posts.user_id')
         ->where('posts.id','>',1);
})->get();
dd($users);

輸出結果為:

array:2 [▼
  0 => {#226 ▼
    +"id": 2
    +"name": "Laravel"
    +"email": "[email protected]"
    +"password": "123"
    +"remember_token": "x"
    +"created_at": "0000-00-00 00:00:00"
    +"updated_at": "0000-00-00 00:00:00"
    +"title": "test2"
    +"content": "test2"
    +"user_id": 1
  }
  1 => {#227 ▼
    +"id": 3
    +"name": "Academy"
    +"email": "[email protected]"
    +"password": "123"
    +"remember_token": "y"
    +"created_at": "0000-00-00 00:00:00"
    +"updated_at": "0000-00-00 00:00:00"
    +"title": "test3"
    +"content": "test3"
    +"user_id": 2
  }
]

2、聯合查詢(union)

聯合查詢用於將兩個或更多查詢的結果集組合為單個結果集,該結果集包含聯合查詢中所有查詢的全部行。UNION的結果集列名與UNION運算子中第一個Select語句的結果集的列名相同,另一個Select語句的結果集列名將被忽略,且其他查詢欄位數必須和第一個相同。Laravel查詢構建器中我們使用union方法進行聯合查詢:

$users = DB::table('users')->where('id','<',3);
$users = DB::table('users')->where('id','>',2)->union($users)->get();
dd($users);

輸出結果為:

array:3 [▼
  0 => {#226 ▼
    +"id": 3
    +"name": "test3"
    +"email": "[email protected]"
    +"password": "123456"
    +"remember_token": "z"
    +"created_at": "2016-03-08 09:45:10"
    +"updated_at": "0000-00-00 00:00:00"
  }
  1 => {#227 ▼
    +"id": 1
    +"name": "Laravel"
    +"email": "[email protected]"
    +"password": "123"
    +"remember_token": "x"
    +"created_at": "2016-03-15 09:45:03"
    +"updated_at": "0000-00-00 00:00:00"
  }
  2 => {#228 ▼
    +"id": 2
    +"name": "Academy"
    +"email": "[email protected]"
    +"password": "123"
    +"remember_token": "y"
    +"created_at": "2016-03-13 09:45:07"
    +"updated_at": "0000-00-00 00:00:00"
  }
]
3where子句

使用查詢構建器上的where方法可以新增自定義查詢條件,呼叫該方法需要傳入三個引數:第一個列名,第二個是操作符,第三個是比較值:

$user = DB::table('users')->where('name','=','Laravel')->get();
dd($user);

如果操作符為“=”,該語句也可簡化為:

$user = DB::table('users')->where('name','Laravel')->get();

需要注意的是查詢構建器支援方法鏈,這意味著如果有多個查詢條件且這個多個條件是AND連線,可以在get之前使用多個where方法。如果多個條件使用OR連線,可以使用orWhere方法:

$user = DB::table('users')->where('name','Laravel')->orWhere('name','Academy')->get();

更多where子句查詢條件可檢視Illuminate\Database\Query\Builder原始碼。

4、排序
查詢構建器使用orderBy方法對查詢結果進行排序:

$users = DB::table('users')->orderBy('id','desc')->get();
dd($users);

根據程式碼可以看到orderBy方法需要傳入兩個引數,第一個是排序欄位,第二個是排序方向,asc代表升序,desc代表倒序

5、分組

為了更好地演示分組,我們給資料表posts新增兩個欄位:cat_id和views,代表分類ID和瀏覽數:
這裡寫圖片描述
分組一般用於聚合查詢,接下來我們使用groupBy方法對查詢結果進行分組,比如我們可以統計每個分類下有幾篇文章:

$posts = DB::table('posts')->select('cat_id',DB::raw('COUNT(id) as num'))->groupBy('cat_id')->get();
dd($posts);
array:2 [▼
  0 => {#226 ▼
    +"cat_id": 1
    +"num": 2
  }
  1 => {#227 ▼
    +"cat_id": 2
    +"num": 1
  }
]

我們還可以使用having方法為分組加上條件,比如我們可以統計總瀏覽數大於500的分類:

$posts = DB::table('posts')->select('cat_id',DB::raw('SUM(views) as views'))->groupBy('cat_id')->having('views','>',500)->get();
dd($posts);

輸出結果為:

array:1 [▼
  0 => {#226 ▼
    +"cat_id": 1
    +"views": "900"
  }
]

注意:having中的條件欄位必須出現在select查詢欄位中,否則會報錯。
6、分頁

查詢構建器中使用skip和take對查詢結果進行分頁,相當於SQL語句中的limit語句:

$posts = DB::table('posts')->skip(0)->take(2)->get();
dd($posts);

對應的輸出結果為:

array:2 [▼
  0 => {#225 ▼
    +"id": 1
    +"title": "test1"
    +"content": "test1"
    +"user_id": 1
    +"created_at": "0000-00-00 00:00:00"
    +"updated_at": "0000-00-00 00:00:00"
    +"cat_id": 1
    +"views": 100
  }
  1 => {#226 ▼
    +"id": 2
    +"title": "test2"
    +"content": "test2"
    +"user_id": 1
    +"created_at": "0000-00-00 00:00:00"
    +"updated_at": "0000-00-00 00:00:00"
    +"cat_id": 2
    +"views": 500
  }
]

相關推薦

Laravel框架學習資料庫高階查詢

1、連線查詢(join) 連線查詢指的是將兩張表或多張表關聯到一起進行查詢,獲取一個表的行與另一個表的行匹配的資料。常見的連線查詢包括內連線(等值連線)、左(外)連線、右(外)連線和交叉連線(完全連線)等。 我們將使用者表users和文章表posts關聯到一

Laravel框架學習使用DB門面操作資料庫 原生SQL

1、連線資料庫 Laravel中資料庫配置檔案為config/database.php,開啟該檔案,預設內容如下: <?php return [ //預設返回結果集為PHP物件例項 //具體返回結果可參考PDO.php(php P

laravel框架學習執行建立中介軟體後,提示無法找到該中介軟體的解決方法

按照官方提供的文件:http://laravelacademy.org/post/7812.html 1.建立中介軟體:先宣告中介軟體, php artisan make:middleware AdminMiddleware 會自動在app/Http/Middlewar

laravel框架學習 解決MySQL5.7以下資料無法遷移的方法

報錯 提示 不支援提供新的utf8字符集 第一種方法:修改字符集 修改字符集: 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 第二種方法:如果不修改字符集 修改下預設字串

laravel框架學習安裝laravel,及laravel-ide-helper增強程式碼提示

1.安裝laravel框架 使用新框架composer是必須會使用的 在PHP環境下 WWW下 直接輸入以下程式碼 composer create-project --prefer-dist laravel/laravel blog "5.4.*" 回車會自動下載lar

laravel框架學習win下php artisan tinker 測試資料時,無法執行報錯的解決方法

問題描述: 複製該路徑,在資源管理器的位址列中開啟,會看到 如下: Temp 往往是系統或者其他軟體生成的快取檔案或目錄 需要返回到上一級目錄Temp中,全選資料夾,刪除,提示不允許刪除的話,

laravel框架學習

學習laravel 前先安裝composer 首先檢查PHP版本及相關擴充套件 PHP >= 5.5.9 OpenSSL擴充套件 PDO擴充套件 Mbstring擴充套件 - 如不滿足以上條件,請修改php.ini配置或重新編譯PHP Linu

Laravel框架學習Request請求資料、Cookie、檔案上傳

1、獲取Request請求資料 Laravel中一般通過控制器方法依賴注入來獲取當前請求的Request例項。 我們通過定義一個隱式控制器來進行本章節的測試。首先我們在routes.php定義路由如下: Route::controller('reque

Laravel框架學習CSRF

CSRF攻擊原理及其防護 1、CSRF攻擊是what? CSRF是跨站請求偽造(Cross-site request forgery)的英文縮寫。具體瞭解請自行百度。 2、Laravel中如何避免CSRF攻擊 Laravel自動為每個使用者Session

Laravel框架學習中介軟體

1、中介軟體簡介 Laravel中可以把HTTP中介軟體看做“裝飾器”,在請求到達最終動作之前對請求進行過濾和處理。中介軟體在Laravel中有著廣泛的應用,比如使用者認證、日誌、維護模式、開啟Session、從Session中獲取錯誤資訊,CSRF驗證,等等

Hadoop學習筆記—15.HBase框架學習基礎知識篇

dfs hdfs keep 負載均衡 包含 兩個 列族 文件存儲 version HBase是Apache Hadoop的數據庫,能夠對大型數據提供隨機、實時的讀寫訪問。HBase的目標是存儲並處理大型的數據。HBase是一個開源的,分布式的,多版本的,面向列的存儲模型,它

HBase框架學習基礎知識篇

HBase是Apache Hadoop的資料庫,能夠對大型資料提供隨機、實時的讀寫訪問。HBase的目標是儲存並處理大型的資料。HBase是一個開源的,分散式的,多版本的,面向列的儲存模型,它儲存的是鬆散型資料。 一、HBase:BigTable的開源實現 1.1 HBas

php laravel框架學習筆記 數據庫操作

true 數據 mar sql show top 一行 ati del 原博客鏈接:http://www.cnblogs.com/bitch1319453/p/6810492.html mysql基本配置 你可用通過配置環境變量,使用cmd進入mysql,當然還有一種東

hibernate框架學習之數據查詢QBChelloworld

string bsp eal ssi alink ger -- sim ali package cn.itcast.h3.query.hql; import java.util.List; import org.hibernate.Criteria; import o

hibernate框架學習之數據查詢HQL

-c skill fir 方式 行數據 del 表數據 ber 描述 lHibernate共提供5種查詢方式?OID數據查詢方式?HQL數據查詢方式?QBC數據查詢方式?本地SQL查詢方式?OGN數據查詢方式OID數據查詢方式l前提:已經獲取到了對象的OIDl查詢:基於OI

hibernate框架學習之數據查詢HQLhelloworld

args 配置 老師 框架 sets 測試 () eat med package cn.itcast.h3.hql; import java.util.List; import org.hibernate.Query; import org.hibernate.Ses

SQL Server資料庫開發3.SQL高階查詢

一,巢狀子查詢         降低SQL語句的複雜度,提高SQL語句的可讀性 --子查詢作為條件  (where) --查詢王五前面的同學 select * from StuInfo where stuid < (select stu

框架學習1——service層,dao層和service實現類進行資料庫操作

最近也是比較忙,也只能忙裡偷閒地抓緊時間接著學習一下技術,自從上次學習了maven之後,越來越對框架產生了興趣,下了好多的spring視屏,聽著老師的建議,最近也萌生了看別人的程式碼進行學習的想法,然後就上了知乎搜了搜優秀的java框架,發現了一個比較感興趣的,

PythonWeb開發Django框架學習十一使用框架自帶Admin管理資料庫資料

上次說到了有關於Model類對於資料庫的資料的增刪改查操作還有一對多,多對多關係的對映操作等等。 這次呢來說一個django管理資料庫的網頁版幫手Admin管理,在我看來,這個和PHP的wamp整合開

PHP Laravel 框架學習筆記 路由器 中介軟體 基礎使用

用了近兩年Thinkphp,嘗試接觸下Laravel框架,在寫這篇文章的時候,其實我已經陸續學習了laravel一個多月,學習期間寫了個簡單的新聞管理系統,基本熟悉laravel的使用,寫這篇文章是回顧並加深所學的知識,並更深入的瞭解框架,使用更多更有意思的