成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Laravel & Lumen 數(shù)據(jù)庫操作速查

用戶83 / 1039人閱讀

摘要:在中執(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ù)如countmax,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();
查詢不同的結(jié)果distinct
$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ù)組比較,則可以使用whereOrWhere方法

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條件
whereBetween / whereNotBetween
$users = DB::table("users")
    ->whereBetween("votes", [1, 100])->get();
$users = DB::table("users")
    ->whereNotBetween("votes", [1, 100])->get();
whereIn / whereNotIn
$users = DB::table("users")
     ->whereIn("id", [1, 2, 3])
     ->get();
$users = DB::table("users")
     ->whereNotIn("id", [1, 2, 3])
     ->get();
whereNull / whereNotNull
$users = DB::table("users")
     ->whereNull("updated_at")
     ->get();
$users = DB::table("users")
     ->whereNotNull("updated_at")
     ->get();
高級where條件
參數(shù)組(嵌套條件)
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")
whereExists (where exist)
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),可以使用skiptake方法

$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

相關(guān)文章

  • Laravel &amp; Lumen之Eloquent ORM使用速查-高級部分

    摘要:使用全局作用域功能可以為模型的所有操作增加約束。提供了一些方法可以方便的來實(shí)現(xiàn)數(shù)據(jù)類型之間的轉(zhuǎn)換。要定義一個(gè),需要在模型中創(chuàng)建一個(gè)名稱為的方法,其中的是駝峰命名法的字段名。 查詢作用域 全局作用域 全局作用域允許你對給定模型的所有查詢添加約束。使用全局作用域功能可以為模型的所有操作增加約束。 軟刪除功能實(shí)際上就是利用了全局作用域功能 實(shí)現(xiàn)一個(gè)全局作用域功能只需要定義一個(gè)實(shí)現(xiàn)Illumi...

    BigNerdCoding 評論0 收藏0
  • Laravel &amp; Lumen之Eloquent ORM使用速查-基礎(chǔ)部分

    摘要:使用時(shí),數(shù)據(jù)庫查詢構(gòu)造器的方法對模型類也是也用的,使用上只是省略了表名部分。在模型中使用成員變量指定綁定的表名。 使用Eloquent [el?kw?nt] 時(shí),數(shù)據(jù)庫查詢構(gòu)造器的方法對模型類也是也用的,使用上只是省略了DB::table(表名)部分。 在模型中使用protected成員變量$table指定綁定的表名。

    NervosNetwork 評論0 收藏0
  • Laravel &amp; Lumen之Eloquent ORM使用速查-進(jìn)階部分

    摘要:關(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)

    Chaz 評論0 收藏0
  • Lumen 初體驗(yà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...

    Cheriselalala 評論0 收藏0
  • BearyChat 消息推送機(jī)器人 For PHP &amp; Laravel

    摘要:后臺經(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í)就...

    王巖威 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<