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)行配置。
-
在需要數(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);
-
修改數(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è)庫絮宁,如:
-
先配置另一個(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', [])
-
在需要的地方注入此連接
use PhpBoot\DB; class Books { /** * @inject another_db * @var DB */ private $db2; }
幫助和文檔
- 在線文檔
- QQ 交流群:185193529
- 本人郵箱 caoyangmin@gmail.com