buyplaytix/databean

DataBean 是一个简单且可测试的 PHP 数据库访问层。

0.7.2 2019-09-16 23:14 UTC

This package is auto-updated.

Last update: 2024-09-17 10:22:05 UTC


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));