buyplaytix / databean
DataBean 是一个简单且可测试的 PHP 数据库访问层。
0.7.2
2019-09-16 23:14 UTC
Requires
- php: >=5.3.2
- ramsey/uuid: ~2.8
Requires (Dev)
- jimbojsb/pseudo: ^0.4.1
- phpunit/phpunit: ^7.3
README
DataBean 是一个简单且可测试的 PHP 数据库访问层。它易于编写测试和创建简单的数据豆来访问和更新数据库。
设置
设置简单
\BuyPlayTix\DataBean\DB::init(array(
"user" => $database_username,
"pass" => $database_password,
"name" => $database_name,
"host" => $database_host,
));
// (optional) pass in a logger that implements IDBLogger
\BuyPlayTix\DataBean\DB::setLogger($logger);
创建数据豆
数据豆直接映射到表。设置数据豆很简单
class Message extends \BuyPlayTix\DataBean\DataBean
{
protected $table = 'MESSAGES';
protected $pk = 'UID';
}
与数据豆交互
加载数据豆
// create a new bean
$message = new Message();
// load a bean by primary key
$message = new Message($uid);
// load a bean by a unique key
$message = new Message(array("SUBJECT", $subject));
加载多个数据豆
// load by a key
$messages = Message::getObjects("OWNER_UID", $owner_uid);
// load by a key with values
$messages = Message::getObjects("OWNER_UID", array($owner_uid1, $owner_uid2, $owner_uid3));
// load by a key with ordering
$messages = Message::getObjects("OWNER_UID", $owner_uid, " ORDER BY INSERT_TIMESTAMP ");
更新
$message->OWNER_UID = $new_owner_uid;
$message->update();
删除
$message->delete();
任意 SQL
为什么你想这样做而不是直接对数据库进行操作?一个词 - "测试"。
// select
$messages = raw_select("MESSAGES", array("UID", "SUBJECT", "BODY"), array("OWNER_UID" => $owner_uid));
// update
raw_update("MESSAGES", array("OWNER_UID" => $new_owner_uid), array("OWNER_UID => $old_owner_uid));
// delete
raw_delete("MESSAGES", array("OWNER_UID => $owner_uid));
// complex query
$results = named_query("MESSAGES_BY_HOUR", "select date_format(INSERT_TIMESTAMP, '%H'), count(*) from MESSAGES group by date_format(INSERT_TIMESTAMP, '%H')");
测试
设置测试
\BuyPlayTix\DataBean\DB::setInstance(\BuyPlayTix\DataBean\NullDB::getInstance());
\BuyPlayTix\DataBean\DataBean::setAdapter(new \BuyPlayTix\DataBean\ObjectAdapter());
一个简单的测试
$message = new Message();
$message->SUBJECT = "A Test Message";
$message->update();
assertEquals(1, Message::getObjects("SUBJECT", array("A Test Message"));
一个更复杂的测试
假设我们想测试在消息数据豆上定义如下方法 get_queries_by_hour:
function get_queries_by_hour() {
return named_query("MESSAGES_BY_HOUR", "select date_format(INSERT_TIMESTAMP, '%H'), count(*) from MESSAGES group by date_format(INSERT_TIMESTAMP, '%H')");
}
$adapter = \BuyPlayTix\DataBean\DataBean::getAdapter();
$adapter->set_named_query_value("MESSAGES_BY_HOUR", array(array("1", 200), array("2", 300));
$results = $message->get_queries_by_hour();
assertEquals(2, count($results));