PhpBoot 是一款為快速開發 RESTful API 而設計的PHP框架(加星請點這里>>>PbpBoot Github<<<)。
PhpBoot\DB 對PDO進行了封裝,使開發者可以更方便的編寫正確和安全的 SQL。下面將繼續上一篇: 快速開發 RESTful 接口的示例,介紹PhpBoot\DB
的使用。
配置
可以通過依賴注入的方式,對數據庫進行配置。
-
在需要數據庫的類中加入依賴注入代碼:
use PhpBoot\DB\DB; use PhpBoot\DI\Traits\EnableDIAnnotations; 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;
}
高級用法
上述示例展示了PhpBoot\DB
的基礎用法,PhpBoot\DB
同時也支持更復雜的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])
而使用PhpBoot\DB
可以解決這個問題:
$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 => \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')),
所以如果你的業務只使用連接一個數據庫,只需要對DB.connection, DB.username ,DB.password, DB.options
進行配置即可。但有的時候可能需要對在應用中連接不同的數據庫,這時可以通過依賴注入配置多個庫,如:
-
先配置另一個數據庫連接
'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