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