laravel 數據庫操作
阿新 • • 發佈:2019-01-16
not ner sql mysq 函數 對象 get tac where
返回值:該方法會返回此聲明所影響的行數
2.4查->
//手動(可配合try catch使用)
1 配置信息
1.1配置目錄: config/database.php 1.2配置多個數據庫//默認的數據庫 ‘mysql‘ => [ ‘driver‘ => ‘mysql‘, ‘host‘ => env(‘DB_HOST‘, ‘localhost‘), ‘port‘ => env(‘DB_PORT‘, ‘3306‘), //更多配置 ], //可以創建更多的數據庫 ‘mysql‘ => [ ‘driver‘ => ‘mysql_2‘, ‘host‘ => env(‘DB_HOST‘, ‘192.168.1.2‘), ‘port‘ => env(‘DB_PORT‘, ‘3306‘), //更多配置 ],
2 使用DB門面進行基本操作
一旦你設置好了數據庫連接,就可以使用 DB facade 來進行查找。DB facade 提供每個類型的查找方法:select、update、insert、delete、statement。 2.1增->DB::insert(‘insert into users (id, name) values (?, ?)‘, [1, ‘Dayle‘]);2.2刪->
$deleted = DB::delete(‘delete from users‘);返回值:刪除的行數將會被返回 2.3改->
$affected = DB::update(‘update users set votes = 100 where name = ?‘, [‘John‘]);
$users = DB::select(‘select * from users where active = ?‘, [1]);返回值:方法總會返回結果的數組數據。數組中的每個結果都是一個 PHP StdClass 對象,這使你能夠訪問到結果的值: 訪問方法:
foreach ($users as $user) { echo $user->name; }2.5事務處理-> //自動
DB::transaction(function () { DB::table(‘users‘)->update([‘votes‘ => 1]); DB::table(‘posts‘)->delete(); });
DB::beginTransaction(); if($someContion){ DB::rollback(); return false; } DB::commit();2.6有時候一些數據庫操作不應該返回任何參數。對於這種類型的操作,你可以在 DB facade 使用 statement 方法:
DB::statement(‘drop table users‘);
3 查詢構造器
為什麽要使用查詢構造器? 1>因為數據庫查詢構造器提供了方便、流暢的接口,我們不需要再寫原生的sql語句,通過查詢構造器提供給我們的各種方法來創建及運行數據庫查找。這能夠滿足我們大部分需要,且能在所有被支持的數據庫系統中使用。 2>Laravel 的查詢構造器使用 PDO 參數綁定,以保護你的應用程序不受數據庫註入攻擊。在傳入字符串作為綁定前不需要先清理它們。 如何得到一個查詢構造器: 依賴DB門面,使用它提供給我們的table方法,傳入表名,即可獲取該表的查詢構建器,在此基礎上我們可以使用強大的鏈式調用直到得到最終結果。3.1 獲取結果
3.1.1 從數據表中獲取所有的數據列$users = DB::table(‘users‘)->get();返回值: 一個數組結果,其中每一個結果都是 PHP StdClass 對象的實例,可以將列作為屬性訪問每個列的值。 訪問方法:
foreach ($users as $user) { echo $user->name; //操作的是對象的屬性 }3.1.2 從數據表中獲取單個列或行 1>取出單行數據,使用first 方法。
$user = DB::table(‘users‘)->where(‘name‘, ‘John‘)->first();返回值:單個 StdClass 對象: 訪問方法:echo $user->name; 2>從單行數據中取出單個值,使用 value 方法。
$email = DB::table(‘users‘)->where(‘name‘, ‘John‘)->value(‘email‘);返回值:直接返回字段的值: 3.1.3 從數據表中將結果切塊 若你需要操作數千條數據庫記錄,則可考慮使用 chunk 方法。這個方法一次只取出一小「塊」結果,並會將每個區塊傳給一個閉包進行處理。 例如,讓我們將整個 user 數據表進行切塊,每次處理 100 條記錄:
DB::table(‘users‘)->chunk(100, function($users) { foreach ($users as $user) { // } });你可以從閉包中返回 false,以停止對後續切塊的處理:
DB::table(‘users‘)->chunk(100, function($users) { // 處理記錄… return false; });3.1.4 獲取字段值列表 若你想要獲取一個包含單個字段值的數組,你可以使用pluck方法
$titles = DB::table(‘roles‘)->pluck(‘title‘);返回值:在這個例子中,我們將取出 role 數據表 title 字段的數組: 使用方法:
foreach ($titles as $title) { echo $title; }你也可以在返回的數組中指定自定義的鍵值字段:
$roles = DB::table(‘roles‘)->pluck(‘title‘, ‘name‘); foreach ($roles as $name => $title) { echo $title; }
3.2 select的用法
3.2.1 指定一個 Select 子句 //指定字段$users = DB::table(‘users‘)->select(‘name‘, ‘email as user_email‘)->get();//distinct 方法允許你強制讓查找返回不重復的結果:
$users = DB::table(‘users‘)->distinct()->get();//已有一個實例,希望在select 子句中再加入一個字段,則可以使用 addSelect 方法:
$query = DB::table(‘users‘)->select(‘name‘); $users = $query->addSelect(‘age‘)->get();3.2.2 原始表達式 //DB::raw 方法可以防止註入 $users = DB::table(‘users‘) ->select(DB::raw(‘count(*) as user_count, status‘)) ->where(‘status‘, ‘<>‘, 1) ->groupBy(‘status‘) ->get();
3.3 join的用法
3.3.1 基本用法(inner join)$users = DB::table(‘users‘) ->join(‘contacts‘, ‘users.id‘, ‘=‘, ‘contacts.user_id‘) ->join(‘orders‘, ‘users.id‘, ‘=‘, ‘orders.user_id‘) ->select(‘users.*‘, ‘contacts.phone‘, ‘orders.price‘) ->get();如果想用左連接或者右連接,則使用leftjoin,rightjoin替換join即可 3.3.2 高級的 Join 語法 你也可以指定更高級的 join 子句。讓我們以傳入一個閉包當作 join 方法的第二參數來作為開始。此閉包會接收 JoinClause 對象,讓你可以在 join 子句上指定約束:
DB::table(‘users‘) ->join(‘contacts‘, function ($join) { $join->on(‘users.id‘, ‘=‘, ‘contacts.user_id‘)->orOn(...); }) ->get();若你想要在連接中使用「where」風格的子句,則可以在連接中使用 where 和 orWhere 方法。這些方法會比較字段和一個值,來代替兩個字段的比較:
DB::table(‘users‘) ->join(‘contacts‘, function ($join) { $join->on(‘users.id‘, ‘=‘, ‘contacts.user_id‘) ->where(‘contacts.user_id‘, ‘>‘, 5); }) ->get();這裏要提一下如果閉包函數functiton(){}中5是個變量,我們需要傳過去那麽應該這樣寫 function ($join) use($num){ $join->on(‘users.id‘, ‘=‘, ‘contacts.user_id‘) ->where(‘contacts.user_id‘, ‘>‘, $num); 如果沒有use($num)外面的$num是沒法傳遞到where子句的
3.4 where的用法
3.4.1 基本用法$users = DB::table(‘users‘)->where(‘votes‘, ‘=‘, 100)->get(); $users = DB::table(‘users‘)->where(‘name‘, ‘like‘, ‘T%‘)->get(); $users = DB::table(‘users‘)->where(‘votes‘, 100)->get(); //省略了等號 $users = DB::table(‘users‘)->where(‘votes‘, ‘>‘, 100) ->orWhere(‘name‘, ‘John‘)->get(); $users = DB::table(‘users‘)->whereBetween(‘votes‘, [1, 100])->get(); //一個字段的值介於兩個值之間 $users = DB::table(‘users‘)->whereNotBetween(‘votes‘, [1, 100])->get(); //一個字段的值落在兩個值之外 $users = DB::table(‘users‘)->whereIn(‘id‘, [1, 2, 3])->get(); //字段的值包含在指定的數組之內 $users = DB::table(‘users‘)->whereNotIn(‘id‘, [1, 2, 3])->get(); //字段的值不包含在指定的數組之內 $users = DB::table(‘users‘)->whereNull(‘updated_at‘)->get(); //指定列的值為 NULL $users = DB::table(‘users‘)->whereNotNull(‘updated_at‘)->get(); //一個列的值不為 NULL3.4.2 高級用法 將約束分組
DB::table(‘users‘) ->where(‘name‘, ‘=‘, ‘John‘) ->orWhere(function ($query) { $query->where(‘votes‘, ‘>‘, 100) ->where(‘title‘, ‘<>‘, ‘Admin‘); }) ->get();上面例子會將閉包傳入 orWhere 方法,以告訴查詢語句構造器開始一個約束分組。此閉包接收一個查詢語句構造器的實例,你可用它來設置應包含在括號分組內的約束。上面的例子會生成以下 SQL:
select * from users where name = ‘John‘ or (votes > 100 and title <> ‘Admin‘)3.5 orderBy,groupBy,having //排序
$users = DB::table(‘users‘) ->orderBy(‘name‘, ‘desc‘) ->get();//隨機排序
$randomUser = DB::table(‘users‘) ->inRandomOrder() ->first();//分組
$users = DB::table(‘users‘) ->groupBy(‘account_id‘) ->having(‘account_id‘, ‘>‘, 100) ->get();//havingRaw 方法可用來將原始字符串設置為 having 子句的值
$users = DB::table(‘orders‘) ->select(‘department‘, DB::raw(‘SUM(price) as total_sales‘)) ->groupBy(‘department‘) ->havingRaw(‘SUM(price) > 2500‘) ->get();3.6 條件查詢語句 可以使用方法 when 來構建條件查詢語句,只有當 when 的第一次參數為 true 的話,匿名函數裏的 where 語句才會被執行:
$role = $request->input(‘role‘); $users = DB::table(‘users‘) ->when($role, function ($query) use ($role) { return $query->where(‘role_id‘, $role); }) ->get();3.7 insert的用法 //插入一組數據
DB::table(‘users‘)->insert( [‘email‘ => ‘[email protected]‘, ‘votes‘ => 0] );//插入多組數據
DB::table(‘users‘)->insert([ [‘email‘ => ‘[email protected]‘, ‘votes‘ => 0], [‘email‘ => ‘[email protected]‘, ‘votes‘ => 0] ]);//若數據表有自動遞增的 id,則可使用 insertGetId 方法來插入記錄並獲取其 ID:
$id = DB::table(‘users‘)->insertGetId( [‘email‘ => ‘[email protected]‘, ‘votes‘ => 0] );3.8 update的用法
DB::table(‘users‘) ->where(‘id‘, 1) ->update([‘votes‘ => 1]);3.9 delete
DB::table(‘users‘)->delete(); DB::table(‘users‘)->where(‘votes‘, ‘<‘, 100)->delete(); //若你希望截去整個數據表的所有數據列,並將自動遞增 ID 重設為零,則可以使用 truncate 方法: DB::table(‘users‘)->truncate();3.10悲觀鎖定 查詢語句構造器也包含一些可用以協助你在 select 語法上作「悲觀鎖定」的函數。若要以「共享鎖」來運行語句,則可在查找上使用 sharedLock 方法。共享鎖可避免選擇的數據列被更改,直到事務被提交為止:
DB::table(‘users‘)->where(‘votes‘, ‘>‘, 100)->sharedLock()->get();此外,你也可以使用 lockForUpdate 方法。「用以更新」鎖可避免數據列被其它共享鎖修改或選取:
DB::table(‘users‘)->where(‘votes‘, ‘>‘, 100)->lockForUpdate()->get();
laravel 數據庫操作