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

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

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

配置

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

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

    use PhpBoot\DB\DB;
    use PhpBoot\DI\Traits\EnableDIAnnotations;
    
    class Books
    {
        use EnableDIAnnotations; //啟用通過@inject標(biāo)記注入依賴
    
        /**
         * @inject
         * @var DB
         */
        private $db;
        
        public function getBooks()...
    }
    

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

    $books->db = $app->get(DB::class);
    
  2. 修改數(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;
}

高級用法

上述示例展示了PhpBoot\DB的基礎(chǔ)用法碉怔,PhpBoot\DB同時(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])

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

$db->select()->from('table')->where('a IN (?)', [1,2,3]);

使用 SQL 函數(shù)

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

$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 => \DI\factory([DB::class, 'connect'])
    ->parameter('dsn', \DI\get('DB.connection'))
    ->parameter('username', \DI\get('DB.username'))
    ->parameter('password', \DI\get('DB.password'))
    ->parameter('options', \DI\get('DB.options')),

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

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

    'another_db' => \DI\factory([DB::class, 'connect'])
        ->parameter('dsn', 'mysql:dbname=phpboot-example;host=127.0.0.1')
        ->parameter('username', 'root')
        ->parameter('password', 'root')
        ->parameter('options', [])
    
  2. 在需要的地方注入此連接

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

幫助和文檔

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末梆暮,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子羞福,更是在濱河造成了極大的恐慌惕蹄,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件治专,死亡現(xiàn)場離奇詭異卖陵,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)张峰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門泪蔫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人喘批,你說我怎么就攤上這事撩荣∠橙啵” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵餐曹,是天一觀的道長逛拱。 經(jīng)常有香客問我,道長台猴,這世上最難降的妖魔是什么朽合? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮饱狂,結(jié)果婚禮上曹步,老公的妹妹穿的比我還像新娘。我一直安慰自己休讳,他們只是感情好讲婚,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著俊柔,像睡著了一般筹麸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上婆咸,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機(jī)與錄音尚骄,去河邊找鬼块差。 笑死,一個(gè)胖子當(dāng)著我的面吹牛倔丈,可吹牛的內(nèi)容都是我干的憨闰。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼需五,長吁一口氣:“原來是場噩夢啊……” “哼鹉动!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起宏邮,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤泽示,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后蜜氨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體械筛,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年飒炎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了埋哟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡郎汪,死狀恐怖赤赊,靈堂內(nèi)的尸體忽然破棺而出闯狱,到底是詐尸還是另有隱情,我是刑警寧澤抛计,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布哄孤,位于F島的核電站,受9級特大地震影響吹截,放射性物質(zhì)發(fā)生泄漏录豺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一饭弓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧媒抠,春花似錦弟断、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至苍匆,卻和暖如春刘急,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背浸踩。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工叔汁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人检碗。 一個(gè)月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓据块,卻偏偏與公主長得像,于是被迫代替她去往敵國和親折剃。 傳聞我的和親對象是個(gè)殘疾皇子另假,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容