在第二天時有提到Eloquent ORM的Model可作為Query Builder去執行對應的SQL語法,讓我們可以限定從資料庫中選擇的資料,因此我在這篇文章中主要整理Query Builder與一些SQL語法。
整理這篇文章的理由在於雖然不同的框架提供不同的ORM去簡化SQL語法的操作,但其最終都是需要SQL語法操作關聯式資料庫,所以了解SQL語法有助於理解ORM的關鍵字與概念。
Route::get('/', function () {
ddd(User::find(1));
return view('welcome');
});
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())
SQL | SELECT email, name FROM users |
---|---|
ORM | App\Models\User::select('name','email')->get(); |
備註 | 加 Distinct可以避免得到重複的數值 |
我其實很少直接用Query Builder的Joins系列,原因在於透過Model中規定其和其他Model的關係,如hasOne/hasMany/belongsTo等,就可以不同的資料表連結起來,這系列會整理在Model與Model的關係中。
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等等也都在這份文件中。
當Query Builder有不支持的SQL語法時,可以使用DB::raw的方法系列,但是此時該SQL語法會被執行,而沒有Parameter Binding保護,要注意SQL注入攻擊。
DB::table('users')->where('votes','>',100)->sharedLock()->get();
DB::table('users')->where('votes','>',100)->lockForUpdate()->get();
Eloquent ORM系列一(單一Model的操作)到這裡整理完畢,接下來是FamilyBoard的Model程式碼介紹。
參考連結:
W3school
Database:Query Builder