资讯专栏INFORMATION COLUMN

PhpBoot 入门(二) 面向对象的方式编写 SQL

whinc / 1975人阅读

摘要:是一款为快速开发而设计的框架加星请点这里。对进行了封装,使开发者可以更方便的编写正确和安全的。下面将继续上一篇快速开发接口的示例,介绍的使用。配置可以通过依赖注入的方式,对数据库进行配置。

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/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元查看
<