knj / d2o
0.5.0
2016-05-10 06:10 UTC
Requires (Dev)
- phpunit/phpunit: ^5.2
README
安装
使用 Composer。
composer require knj/d2o
从 PDO 使用 D2O
如果使用 D2O,您可以使用 PDO 和 PDOStatement 通过方法链使用单个语句
$d2o = new Wazly\D2O($dsh, $username, $password); $sql = 'SELECT * FROM users WHERE id = :id' $row = $d2o ->state($sql) ->run([':id' => 3]) ->pick();
否则需要将 $dbh 作为 PDO,将 $stmt 作为 PDOStatement,至少需要 3 个语句
$dbh = new PDO($dsh, $username, $password); $sql = 'SELECT * FROM users WHERE id = :id'; $stmt = $dbh->prepare($sql); $stmt->execute([':id' => 3]); $row = $stmt->fetch(PDO::FETCH_OBJ);
方法
state ( string $statement )
D2O::state() 应由 D2O 直接调用。它与 PDO::prepare() 几乎相同,但返回 D2O 实例本身。
$d2o->state($sql); // returns $d2o
bind ( [ array $parameters [, string $bind_type = 'value' ] ] )
D2O::bind() 应在 D2O::state() 之后调用。它与 PDOStatement::bindValue() 类似,但返回 D2O 实例。
$d2o->state($sql) ->bind([ ':role' => $role, ':limit' => [$limit, 'int'], ]); // returns $d2o
run ( [ array $parameters [, string $bind_type = 'value' ] ] )
D2O::run() 应在 D2O::state() 之后调用。它与 PDOStatement::execute() 类似,但返回 D2O 实例。
$d2o->state($sql) ->bind([ ':role' => $role, ':limit' => [$limit, 'int'], ]) ->run(); // returns $d2o $d2o->state($sql) ->run([ ':role' => $role, ':limit' => [$limit, 'int'], ]); // the same as the above
pick ( string $fetch_style )
D2O::pick() 应在 D2O::run() 之后调用。它与 PDOStatement::fetch() 几乎相同。它不返回实例,而是查询结果。
$row = $d2o->state($sql) ->run([ ':role' => $role, ':limit' => [1, 'int'], ]) ->pick(); // recommended if the number of rows is supposed to be 1 $result = $d2o->state($sql) ->run([ ':role' => $role, ':limit' => [$limit, 'int'], ]); // recommended if the number of rows is supposed to be 2 or more $row1 = $result->pick(); $row2 = $result->pick(); $row3 = $result->pick();
format ( string $fetch_style )
D2O::format() 应在 D2O::run() 之后调用。它与 PDOStatement::fetchAll() 几乎相同。它不返回实例,而是查询结果。
$rows = $d2o->state($sql) ->run([ ':role' => $role, ':limit' => [$limit, 'int'], ]) ->format();
getStatement()
D2O::getStatement() 在 D2O 中返回 PDOStatement 对象。例如,您可以使用 PDOStatement::fetchAll() 而不是 D2O::format()。
$rows = $d2o->state($sql)->run()->getStatement()->fetchAll();
D2O 和 PDO 的区别
PDOStatement 位于 D2O 内部
使用 PDO 时,需要一个额外的变量来包含 PDOStatement 实例。然而,D2O 将 PDOStatement 作为其属性,因此可以提供方法链。
连续插入示例:
$d2o->state('INSERT INTO items(name, price) VALUES (:name, :price)') ->run(['name' => 'pencil', 'price' => 20]) ->run(['name' => 'eraser', 'price' => 60]) ->run(['name' => 'notebook', 'price' => 100]);
数据绑定
D2O 在在占位符上绑定值时节省了编码
$d2o->bind([ 'role' => 'editor', // ':role' => 'editor', PDO::PARAM_STR 'limit' => 20, // ':limit' => 20, PDO::PARAM_INT 'hash' => '6293', // ':hash' => '6293', PDO::PARAM_STR 'id' => [36, 'str'], // ':id' => 36, PDO::PARAM_STR ]);
- 您不必使用冒号
- 当值为字符串、整数或 null 时,不必使用
PDO_PARAM_* - 您可以更简洁地指定数据类型,例如
'str'而不是PDO::PARAM_STR
并且 D2O 从不调用 PDOStatement::bindParam()。
