国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

PhpBoot 入門(二) 面向對象的方式編寫 SQL

whinc / 1995人閱讀

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

PhpBoot 是一款為快速開發 RESTful API 而設計的PHP框架(加星請點這里>>>PbpBoot Github<<<)。

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

配置

可以通過依賴注入的方式,對數據庫進行配置。

在需要數據庫的類中加入依賴注入代碼:

use PhpBootDBDB;
use PhpBootDITraitsEnableDIAnnotations;

class Books
{
    use EnableDIAnnotations; //啟用通過@inject標記注入依賴

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

框架在實例化Books后,根據@inject注釋, 自動給屬性$db賦值,其邏輯等價于:

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

修改數據庫配置

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

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

編寫 SQL

下面將通過實現 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的基礎用法,PhpBootDB同時也支持更復雜的SQL。

復雜 WHERE

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

->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時,WHERE IN的預處理方式很不方便,需要為IN的元素預留數量相等的?, 比如:

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

而使用PhpBootDB可以解決這個問題:

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

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

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

等價 的 SQL:

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

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

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

與下面 SQL 等價

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

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

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

與下面 SQL 等價

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

事務允許嵌套,但只有最外層的事務起作用,內部嵌套的事務與最外層事務將被當做同一個事務。

使用多個數據庫

PhpBoot 為DB 類定義了默認的構造方式,形式如下:

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")),

所以如果你的業務只使用連接一個數據庫,只需要對DB.connection, DB.username ,DB.password, DB.options進行配置即可。但有的時候可能需要對在應用中連接不同的數據庫,這時可以通過依賴注入配置多個庫,如:

先配置另一個數據庫連接

"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

本人郵箱 caoyangmin@gmail.com

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/25707.html

相關文章

  • PhpBoot】 為快速開發 RESTful API 設計PHP框架

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

    mist14 評論0 收藏0
  • 區塊鏈開發中使用最流行編程語言

    摘要:我們目前正處于一個新興的區塊鏈開發行業中。,一種在以太坊開發人員中流行的新的簡單編程語言,因為它是用于開發以太坊智能合約的語言。它是全球至少萬開發人員使用的世界上最流行的編程語言之一。以太坊,主要是針對工程師使用進行區塊鏈以太坊開發的詳解。 我們目前正處于一個新興的區塊鏈開發行業中。區塊鏈技術處于初期階段,然而這種顛覆性技術已經成功地風靡全球,并且最近經歷了一場與眾不同的繁榮。由于許多...

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

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

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

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

    sutaking 評論0 收藏0

發表評論

0條評論

whinc

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<