iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 3
1
Software Development

30天完成家庭任務平台系列 第 3

30天完成家庭任務平台:第三天

  • 分享至 

  • xImage
  •  

在第二天時有提到Eloquent ORM的Model可作為Query Builder去執行對應的SQL語法,讓我們可以限定從資料庫中選擇的資料,因此我在這篇文章中主要整理Query Builder與一些SQL語法。
整理這篇文章的理由在於雖然不同的框架提供不同的ORM去簡化SQL語法的操作,但其最終都是需要SQL語法操作關聯式資料庫,所以了解SQL語法有助於理解ORM的關鍵字與概念。

  • 如果要知道Eloquent ORM到底執行了什麼SQL語法,有兩個方式提供給各位:
  1. 在HTTP請求中使用ddd(),則當開啟首頁時,就會跑出除錯的頁面:
Route::get('/', function () {
   ddd(User::find(1));
   return view('welcome');
});

https://ithelp.ithome.com.tw/upload/images/20200918/20129592EDmjJ8xPnW.png

  1. 在官方網站有提供dd()和dump()兩個方法查詢SQL語法,但主要是用於讀取資料時
DB::table('users')->where('votes', '>', 100)->dd();
DB::table('users')->where('votes', '>', 100)->dump();

ps. DB::table('users')->dd()和 App\User::dd()時會得到同樣的結果 "select * from users"。(Laravel 8: App\Models\User::dd())

  • 常用的Query Builder整理
  1. Select 陳述(SELECT column1, column2, ...FROM table_name;)
SQL SELECT email, name FROM users
ORM App\Models\User::select('name','email')->get();
備註 加 Distinct可以避免得到重複的數值
  1. Joins陳述(SELECT column_name(s)FROM table1 JOIN table2 ON table1.column_name = table2.column_name;)

我其實很少直接用Query Builder的Joins系列,原因在於透過Model中規定其和其他Model的關係,如hasOne/hasMany/belongsTo等,就可以不同的資料表連結起來,這系列會整理在Model與Model的關係中。

  1. Where陳述(SELECT column1, column2, .FROM table_name WHERE condition;):
    Where陳述是用來設定選擇資料的條件,Laravel提供很多方便的Where陳述如下:
Where陳述 功能
orWhere... 用來多加一個Or的條件判斷
whereBetween/whereNotBetween(column_name,[value1,value2]) 設定該欄位的值是否在區間(value1,value2)條件內/外
whereIn / whereNotIn(column_name,$array = [value1,value2,value3]) 設定該欄位的值是否符合/不符合$array中的值
whereNull / whereNotNull(column_name) 設定該欄位的值是/不是空值null
whereDate / whereMonth / whereDay / whereYear / whereTime (column_name,$requiredTime) 設定該欄位的時間值是否符合$requiredTime(日期/月/日/年...)
whereColumn(column1_name,operator,column2_name) 比較欄位1與欄位2
whereExists(subquery) 跟SQLWHERE EXISTS作用一樣,確定subquery有值

還有許多常用的SQL語法,如groupBy / having等等也都在這份文件中。

  • 原生SQL語法

當Query Builder有不支持的SQL語法時,可以使用DB::raw的方法系列,但是此時該SQL語法會被執行,而沒有Parameter Binding保護,要注意SQL注入攻擊。

  • 悲觀鎖:Query Builder也提供一些功能來實施鎖的功能
  1. 提供shared lock,可讀但不可寫
DB::table('users')->where('votes','>',100)->sharedLock()->get();
  1. 提供lockForUpdate,不可讀也不可寫
DB::table('users')->where('votes','>',100)->lockForUpdate()->get();

Eloquent ORM系列一(單一Model的操作)到這裡整理完畢,接下來是FamilyBoard的Model程式碼介紹。

參考連結:
W3school
Database:Query Builder


上一篇
30天完成家庭任務平台:第二天
下一篇
30天完成家庭任務平台:第四天
系列文
30天完成家庭任務平台30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言