摘要:在中執行數據庫操作有兩種方式,一種是使用外觀對象的靜態方法直接執行查詢,另外一種是使用類的靜態方法實際上也是的實現,使用靜態訪問方式訪問的方法,內部采用了魔術方法代理了對成員方法的訪問。在閉包函數中,如果返回,則會停止后續的處理。
在Laravel中執行數據庫操作有兩種方式,一種是使用DB外觀對象的靜態方法直接執行sql查詢,另外一種是使用Model類的靜態方法(實際上也是Facade的實現,使用靜態訪問方式訪問Model的方法,內部采用了__callStatic魔術方法代理了對成員方法的訪問。
查詢操作 基本查詢操作 使用sql語句執行select查詢操作$results = DB::select("select * from users where id = ?", [1]); foreach ($results as $res) { echo $res->name; }
返回結果為數組,數組中每一個值為一個StdClass對象。
也可以使用命名綁定,推薦使用這種方式,更加清晰一些
$results = DB::select("select * from users where id = :id", ["id" => 1]);從數據表中取得所有的數據列
$users = DB::table("users")->get(); foreach ($users as $user) { var_dump($user->name); }從表中查詢單行/列
使用first方法返回單行數據,該方法返回的是一個stdClass對象
$user = DB::table("users")->where("name", "John")->first(); echo $user->name;
如果只需要一列的值,則可以使用value方法直接獲取單列的值
$email = DB::table("users")->where("name", "John")->value("email");從數據表中分塊查找數據列
該方法用于數據表中有大量的數據的操作,每次從結果集中取出一部分,使用閉包函數進行處理,然后再處理下一部分,該命令一般用于Artisan命令行程序中處理大量數據。
DB::table("users")->chunk(100, function($users) { foreach ($users as $user) { // } });
在閉包函數中,如果返回false,則會停止后續的處理。
從數據表中查詢某一列的列表比如我們希望查詢出角色表中所有的title字段值
$titles = DB::table("roles")->pluck("title"); foreach ($titles as $title) { echo $title; }
這里的pluck函數有兩個參數
Collection pluck( string $column, string|null $key = null)
第一個參數為要查詢的列,第二個參數是每一列的key
$roles = DB::table("roles")->pluck("title", "name"); foreach ($roles as $name => $title) { echo $title; }聚集函數
查詢構造器也提供了一些聚集函數如count,max,min,avg,sum等
$users = DB::table("users")->count(); $price = DB::table("orders")->max("price"); $price = DB::table("orders") ->where("finalized", 1) ->avg("price");指定select查詢條件
$users = DB::table("users")->select("name", "email as user_email")->get();
如果已經指定了select,但是又希望再次添加一些字段,使用它addSelect方法
$query = DB::table("users")->select("name"); $users = $query->addSelect("age")->get();
$users = DB::table("users")->distinct()->get();使用原生表達式
使用DB::raw方法可以向查詢中注入需要的sql片段,但是非常不推薦使用該方法,用不好會 產生sql注入
$users = DB::table("users") ->select(DB::raw("count(*) as user_count, status")) ->where("status", "<>", 1) ->groupBy("status") ->get();Join操作 內連接 Inner Join
使用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();左連接 Left Join
使用leftJoin方法執行左連接操作,參數和join一樣
$users = DB::table("users") ->leftJoin("posts", "users.id", "=", "posts.user_id") ->get();高級Join方法
如果join方法的約束條件比較復雜,可以使用閉包函數的方式指定
DB::table("users") ->join("contacts", function ($join) { $join->on("users.id", "=", "contacts.user_id")->orOn(...); }) ->get();
如果join約束中要使用列值與指定數組比較,則可以使用where和OrWhere方法
DB::table("users") ->join("contacts", function ($join) { $join->on("users.id", "=", "contacts.user_id") ->where("contacts.user_id", ">", 5); }) ->get();Union操作
要使用union操作,可以先創建一個query,然后再使用union方法去綁定第二個query
$first = DB::table("users") ->whereNull("first_name"); $users = DB::table("users") ->whereNull("last_name") ->union($first) ->get();
同樣,unionAll方法也是可以使用的,參數與union相同。
Where查詢條件 簡單的wehere條件使用where方法為查詢增加where條件,該函數一般需要三個參數:列名,操作符(任何數據庫支持的操作符都可以),列值。
$users = DB::table("users")->where("votes", "=", 100)->get(); $users = DB::table("users")->where("votes", 100)->get();
為了方便起見,如果只提供兩個參數,則默認第二個參數為=,執行相等匹配。
$users = DB::table("users") ->where("votes", ">=", 100) ->get(); $users = DB::table("users") ->where("votes", "<>", 100) ->get(); $users = DB::table("users") ->where("name", "like", "T%") ->get();
where條件也可以使用數組提供:
$users = DB::table("users")->where([ ["status","1"], ["subscribed","<>","1"], ])->get();OR條件
如果where條件要使用or操作,則使用orWhere方法
$users = DB::table("users") ->where("votes", ">", 100) ->orWhere("name", "John") ->get();其它where條件
$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(); $users = DB::table("users") ->whereNotNull("updated_at") ->get();高級where條件
DB::table("users") ->where("name", "=", "John") ->orWhere(function ($query) { $query->where("votes", ">", 100) ->where("title", "<>", "Admin"); }) ->get();
上述代碼等價于下列sql
select * from users where name = "John" or (votes > 100 and title <> "Admin")
DB::table("users") ->whereExists(function ($query) { $query->select(DB::raw(1)) ->from("orders") ->whereRaw("orders.user_id = users.id"); }) ->get();
上述代碼與下列sql等價
select * from users where exists ( select 1 from orders where orders.user_id = users.id )JSON類型的列查詢
MySQL 5.7和Postgres數據庫中提供了新的數據類型json,對json提供了原生的支持,使用->可以對json列進行查詢。
$users = DB::table("users") ->where("options->language", "en") ->get(); $users = DB::table("users") ->where("preferences->dining->meal", "salad") ->get();Ordering, Grouping, Limit, & Offset
$users = DB::table("users") ->orderBy("name", "desc") ->get(); $users = DB::table("users") ->groupBy("account_id") ->having("account_id", ">", 100) ->get(); $users = DB::table("orders") ->select("department", DB::raw("SUM(price) as total_sales")) ->groupBy("department") ->havingRaw("SUM(price) > 2500") ->get();
要限制查詢返回的結果行數,或者是跳過指定行數的結果(OFFSET),可以使用skip和take方法
$users = DB::table("users")->skip(10)->take(5)->get();插入操作 使用sql語句執行插入
插入操作與select操作類似,使用insert函數
DB::insert("insert into users (id, name) values (?, ?)", [1, "Dayle"]);基本插入操作
DB::table("users")->insert( ["email" => "john@example.com", "votes" => 0] ); DB::table("users")->insert([ ["email" => "taylor@example.com", "votes" => 0], ["email" => "dayle@example.com", "votes" => 0] ]);
如果希望插入后能夠獲取新增數據的id,則可以使用insertGetId方法
$id = DB::table("users")->insertGetId( ["email" => "john@example.com", "votes" => 0] );更新操作 使用sql語句執行更新操作
執行DB中的update后,會返回 操作影響的數據行數
DB::update("update users set votes = 100 where name = ?", ["John"]);基本更新操作
DB::table("users") ->where("id", 1) ->update(["votes" => 1]);指定列的增減
DB::table("users")->increment("votes"); DB::table("users")->increment("votes", 5); DB::table("users")->decrement("votes"); DB::table("users")->decrement("votes", 5);
在執行自增/減操作的時候,也可以同時更新其它列
DB::table("users")->increment("votes", 1, ["name" => "John"]);刪除操作 使用sql執行刪除
執行DB中的delete后,會返回 操作影響的數據行數
DB::delete("delete from users");基本刪除操作
DB::table("users")->delete(); DB::table("users")->where("votes", "<", 100)->delete();
如果希望truncate整個表,則使用truncate方法
DB::table("users")->truncate();悲觀鎖
使用sharedLock方法可以避免選定的行在事務提交之前被修改
DB::table("users")->where("votes", ">", 100)->sharedLock()->get();
另外lockForUpdate方法可以避免其它的共享鎖修改或者是選定
DB::table("users")->where("votes", ">", 100)->lockForUpdate()->get();事務處理
使用transaction方法的callback函數執行事務處理
DB::transaction(function() { DB::table("users")->update(["votes" => 1]); DB::table("posts")->delete(); });
在回調函數中,拋出任何異常都會導致事務回滾
如果需要手動管理事務,則使用如下函數
DB::beginTransaction(); DB::rollback(); DB::commit();
查看日志記錄使用DB類的靜態方法啟用的事務不僅對普通sql查詢有效,對Eloquent ORM同樣有效,因為它內部也是調用了DB類的數據庫連接。
查看請求執行的sql日志記錄,需要先執行enableQueryLog開啟,然后執行getQueryLog獲取
DB::connection()->enableQueryLog(); $queries = DB::getQueryLog();其它操作
執行一般的sql語法
DB::statement("drop table users");
監聽查找事件,可以用來對執行的sql進行記錄
DB::listen(function($sql, $bindings, $time) { // $query->sql // $query->bindings // $query->time });
獲取某個數據庫連接
$users = DB::connection("foo")->select(...);
如果還不能滿足需求,可以獲取PDO對象
$pdo = DB::connection()->getPdo();
這樣不管什么操作都可以做了吧
另外含有兩個方法,用于重新連接到指定數據庫和斷開連接
DB::reconnect("foo"); DB::disconnect("foo")d;
參考: Laravel 5.2 官方文檔
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/21725.html
摘要:使用全局作用域功能可以為模型的所有操作增加約束。提供了一些方法可以方便的來實現數據類型之間的轉換。要定義一個,需要在模型中創建一個名稱為的方法,其中的是駝峰命名法的字段名。 查詢作用域 全局作用域 全局作用域允許你對給定模型的所有查詢添加約束。使用全局作用域功能可以為模型的所有操作增加約束。 軟刪除功能實際上就是利用了全局作用域功能 實現一個全局作用域功能只需要定義一個實現Illumi...
摘要:使用時,數據庫查詢構造器的方法對模型類也是也用的,使用上只是省略了表名部分。在模型中使用成員變量指定綁定的表名。 使用Eloquent [el?kw?nt] 時,數據庫查詢構造器的方法對模型類也是也用的,使用上只是省略了DB::table(表名)部分。 在模型中使用protected成員變量$table指定綁定的表名。
摘要:關聯關系查詢在中,所有的關系都是使用函數定義的,可以在不執行關聯查詢的情況下獲取關聯的實例。 關聯關系 One To One 假設User模型關聯了Phone模型,要定義這樣一個關聯,需要在User模型中定義一個phone方法,該方法返回一個hasOne方法定義的關聯
摘要:的現狀目前是版本,是基于開發。入口文件啟動文件和配置文件框架的入口文件是。在路由中指定控制器類必須寫全命名空間,不然會提示找不到類。目前支持四種數據庫系統以及。使用時發生錯誤,因為在文件中,的默認驅動是。 最近使用 Lumen 做了 2 個業余項目,特此記錄和分享一下。 Lumen 的介紹 在使用一項新的技術時,了解其應用場景是首要的事情。 Lumen 的口號:為速度而生的 La...
摘要:后臺經常需要給管理員老板運營推送一些事件消息,比如有用戶購買了報錯服務器流量預警有新的評論收到新的意見反饋今日超過等等。 后臺經常需要給管理員/老板/運營推送一些事件消息,比如有用戶購買了VIP、PHP 報錯、服務器流量預警、App Store 有新的評論、收到新的意見反饋、今日 DAU 超過 10W+ 等等。我之前是做了一個簡單的 iOS 應用來接收 Push 消息,需要推送消息時就...
閱讀 747·2021-07-25 21:37
閱讀 3660·2019-08-30 15:55
閱讀 2574·2019-08-30 15:54
閱讀 1722·2019-08-30 15:44
閱讀 3126·2019-08-30 15:44
閱讀 864·2019-08-30 15:43
閱讀 1032·2019-08-29 15:36
閱讀 3044·2019-08-29 10:58