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

資訊專欄INFORMATION COLUMN

PhpBoot 入門(二) 面向?qū)ο蟮姆绞骄帉?SQL

whinc / 2005人閱讀

摘要:是一款為快速開發(fā)而設(shè)計(jì)的框架加星請點(diǎn)這里。對進(jìn)行了封裝,使開發(fā)者可以更方便的編寫正確和安全的。下面將繼續(xù)上一篇快速開發(fā)接口的示例,介紹的使用。配置可以通過依賴注入的方式,對數(shù)據(jù)庫進(jìn)行配置。

PhpBoot 是一款為快速開發(fā) RESTful API 而設(shè)計(jì)的PHP框架(加星請點(diǎn)這里>>>PbpBoot Github<<<)。

PhpBootDB 對PDO進(jìn)行了封裝,使開發(fā)者可以更方便的編寫正確和安全的 SQL。下面將繼續(xù)上一篇: 快速開發(fā) RESTful 接口的示例,介紹PhpBootDB的使用。

配置

可以通過依賴注入的方式,對數(shù)據(jù)庫進(jìn)行配置。

在需要數(shù)據(jù)庫的類中加入依賴注入代碼:

use PhpBootDBDB;
use PhpBootDITraitsEnableDIAnnotations;

class Books
{
    use EnableDIAnnotations; //啟用通過@inject標(biāo)記注入依賴

    /**
     * @inject
     * @var DB
     */
    private $db;
    
    public function getBooks()...
}

框架在實(shí)例化Books后,根據(jù)@inject注釋, 自動(dòng)給屬性$db賦值,其邏輯等價(jià)于:

$books->db = $app->get(DB::class);

修改數(shù)據(jù)庫配置

在 config.php 中加入以下配置(數(shù)據(jù)庫地址等需根據(jù)實(shí)際情況修改):

"DB.connection"=> "mysql:dbname=phpboot-example;host=127.0.0.1",
"DB.username"=> "root",
"DB.password"=> "root",
"DB.options" => [],

編寫 SQL

下面將通過實(shí)現(xiàn) createBook、deleteBook、updateBook、findBooks 方法,演示insert、delete、update、select 的使用。

INSERT
public function createBook(Book $book)
{
    $newId = $this->db->insertInto("books")
        ->values([
            "name"=>$book->name,
            "brief"=>$book->brief,
            ...
        ])
        ->exec()
        ->lastInsertId(); 
    return $newId;
}
DELETE
public function deleteBook($id)
{
    $this->db->deleteFrom("books")
        ->where(["id"=>$id])
        ->exec();
}
UPDATE
public function updateBook(Book $book)
{
    $this->db->update("books")
        ->set([
            "name"=>$book->name,
            "brief"=>$book->brief,
            ...
        ])
        ->where(["id"=>$book->id])
        ->exec(); 
}
SELECT
public function findBooks($name, $offsit, $limit)
{
    $books = $this->db->select("*")
        ->from("books")
        ->where("name LIKE ?", "%$name%")
        ->orderBy("id")
        ->limit($offsit, $limit)->get();
        
    return $books;
}
高級用法

上述示例展示了PhpBootDB的基礎(chǔ)用法,PhpBootDB同時(shí)也支持更復(fù)雜的SQL。

復(fù)雜 WHERE

類似 SQL WHERE a=1 OR (b=2 and c=3), 可以以下代碼實(shí)現(xiàn):

->where(["a"=>1])
->orWhere(function(ScopedQuery $query){
    $query->where(["b"=>2, "c"=>3])
})

上面例子中,ScopedQuery 中還能再嵌套 ScopedQuery。

JOIN
$db->select("books.*", DB::raw("authors.name as author"))
    ->from("books")
    ->where(["books.id"=>1])
    ->leftJoin("authors")->on("books.authorId = authors.id")
    ->get()
WHERE ... IN ...

使用PDO時(shí),WHERE IN的預(yù)處理方式很不方便,需要為IN的元素預(yù)留數(shù)量相等的?, 比如:

$pdo->prepare(
    "SELECT * FROM table WHERE a IN (?,?,?)"
)->execute([1,2,3])

而使用PhpBootDB可以解決這個(gè)問題:

$db->select()->from("table")->where("a IN (?)", [1,2,3]);
使用 SQL 函數(shù)

默認(rèn)情況下,框架會(huì)對輸入做轉(zhuǎn)換, 如會(huì)在表名和列名外加上 `` ,會(huì)把變量作為綁定處理,比如下面的語句

$db->select("count(*) AS count")
    ->from("table")
    ->where(["time"=>[">"=>"now()"]]);

等價(jià) 的 SQL:

SELECT `count(*) AS count` FROM `table` where `time` > "now()"

如果希望框架不做轉(zhuǎn)換,需要使用DB::raw(),比如:

$db->select(DB::raw("count(*) AS count"))
    ->from("table")
    ->where(["time"=>[">"=>DB::raw("now()")]]);

與下面 SQL 等價(jià)

SELECT count(*) AS count FROM `table` where `time` > now()
子查詢

下面代碼演示子查詢用法:

$parent = $db->select()->from("table1")->where("a=1");
$child = $db->select()->from($parent);

與下面 SQL 等價(jià)

SELECT * FROM (SELECT * FROM `table1` WHERE a=1)
事務(wù)
$db->transaction(
    function(DB $db){
        $db->update("table1")->...
        $db->update("table1")->...
    }
)

事務(wù)允許嵌套,但只有最外層的事務(wù)起作用,內(nèi)部嵌套的事務(wù)與最外層事務(wù)將被當(dāng)做同一個(gè)事務(wù)。

使用多個(gè)數(shù)據(jù)庫

PhpBoot 為DB 類定義了默認(rèn)的構(gòu)造方式,形式如下:

DB::class => DIfactory([DB::class, "connect"])
    ->parameter("dsn", DIget("DB.connection"))
    ->parameter("username", DIget("DB.username"))
    ->parameter("password", DIget("DB.password"))
    ->parameter("options", DIget("DB.options")),

所以如果你的業(yè)務(wù)只使用連接一個(gè)數(shù)據(jù)庫,只需要對DB.connection, DB.username ,DB.password, DB.options進(jìn)行配置即可。但有的時(shí)候可能需要對在應(yīng)用中連接不同的數(shù)據(jù)庫,這時(shí)可以通過依賴注入配置多個(gè)庫,如:

先配置另一個(gè)數(shù)據(jù)庫連接

"another_db" => DIfactory([DB::class, "connect"])
    ->parameter("dsn", "mysql:dbname=phpboot-example;host=127.0.0.1")
    ->parameter("username", "root")
    ->parameter("password", "root")
    ->parameter("options", [])

在需要的地方注入此連接

use PhpBootDB;

class Books
{
    /**
     * @inject another_db
     * @var DB
     */
    private $db2;
}

幫助和文檔

在線文檔

QQ 交流群:185193529

本人郵箱 [email protected]

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/25707.html

相關(guān)文章

  • PhpBoot】 為快速開發(fā) RESTful API 設(shè)計(jì)PHP框架

    摘要:是為快速開發(fā)設(shè)計(jì)的框架。特色框架提供許多主流的特性如依賴注入等。輕松支持是目前最流行的接口文檔框架。在一開始就非常注重框架的友好性盡可能讓框架保持準(zhǔn)確的代碼提示。 PhpBoot showImg(https://segmentfault.com/img/remote/1460000004864102);showImg(https://segmentfault.com/img/remot...

    mist14 評論0 收藏0
  • 區(qū)塊鏈開發(fā)中使用最流行編程語言

    摘要:我們目前正處于一個(gè)新興的區(qū)塊鏈開發(fā)行業(yè)中。,一種在以太坊開發(fā)人員中流行的新的簡單編程語言,因?yàn)樗怯糜陂_發(fā)以太坊智能合約的語言。它是全球至少萬開發(fā)人員使用的世界上最流行的編程語言之一。以太坊,主要是針對工程師使用進(jìn)行區(qū)塊鏈以太坊開發(fā)的詳解。 我們目前正處于一個(gè)新興的區(qū)塊鏈開發(fā)行業(yè)中。區(qū)塊鏈技術(shù)處于初期階段,然而這種顛覆性技術(shù)已經(jīng)成功地風(fēng)靡全球,并且最近經(jīng)歷了一場與眾不同的繁榮。由于許多...

    2shou 評論0 收藏0
  • Hibernate入門這一篇就夠了

    摘要:一般地我們的映射配置文件和對象是放在同一個(gè)包下的。并且映射文件的命名是有規(guī)范的。指定字符的長度默認(rèn)為指定映射表的字段的類型,如果 前言 本博文主要講解介紹Hibernate框架,ORM的概念和Hibernate入門,相信你們看了就會(huì)使用Hibernate了! 什么是Hibernate框架? Hibernate是一種ORM框架,全稱為 Object_Relative DateBase-M...

    fizz 評論0 收藏0
  • 趣味Python入門(一):初識Python

    摘要:盡管如此,還具有高級的數(shù)據(jù)類型和靈活性。它配備了大量的標(biāo)準(zhǔn)模塊,可用于程序庫。一些模塊提供如下功能通過這些很贊的特性,瞬時(shí)化身為面向過程的語言。開發(fā)者可以便捷地將解釋器連接到一個(gè)使用編寫的應(yīng)用程序,并能隨時(shí)用作擴(kuò)展。下一部分會(huì)繼續(xù)分享。 【編者按】本文作者是 Abhishek Jaiswal ,擅長 .NET、C#、Python 等多種語言的技術(shù)控。本文中,作者通過活潑有趣的口吻向大家...

    sutaking 評論0 收藏0

發(fā)表評論

0條評論

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