rdx / db
简单的 MySQL/SQLite 包装器
1.25
2022-09-21 21:49 UTC
README
驱动器/适配器/数据库
- SQLite 3 (通过 PDO)
- MySQLi
没有 SQLite 2 或过程化 MySQL。这是什么,2003 年吗?
如何开始
查看 test/
目录。它包含一些 简单 的测试/示例。
查看使用它的项目。一个强大的、非常实用 的功能是模式 'sync':创建表、列、索引、关系和固定数据,所有这些都在一个干净的数组中。
动手做吧!你可以创建其他驱动器。只需扩展 db_generic
和 db_generic_result
。你可以称之为 db_pgsql
=) NoSQL 不会工作,因为没有查询构建器(而且不会有)。
给我看看例子!
好吧。
简单的选择。将返回一个可迭代对象。
$users = $db->select('users', 'lastname <> ?', array("De'sander"));
print_r($users); // NOT a list of users
获取第一个结果对象。
$user = $users->nextObject();
var_dump($user->lastname);
进行 GROUP BY 并获取二维数组。
$users_by_lastname = $db->select_fields('users', 'lastname, COUNT(1)', 'active = ? GROUP BY lastname', array(1));
var_dump($users_by_lastname["De'sander"]);
另一个例子。非常适合 HTML <option>
。
$options = $db->select_fields('countries', 'code, name', array('active' => 1));
以不同的类返回对象。哇,活动记录。使用 ->all()
获取所有对象。
$sessions = $db->fetch('SELECT s.* from sessions s, people p WHERE p.access_level = ? AND p.id = s.person_id', array(
'params' => array(4),
'class' => 'UserSession',
))->all();
var_dump(get_class($sessions[0])); // UserSession
更高级的条件。
$people = $db->select('people', array(
// Conditions
'enabled' => 1,
'age >= ?',
'age <= ?',
'lastname <> ?',
'(a < b OR b IS NULL)'
), array(
// Params
18,
65,
"De'sander",
));
当然还有更新和插入等。
$bool = $db->update('people', array('enabled' => 0), array(
'last_login' => 0,
'favourite_pizza IS NULL',
));
$affected = $db->affected_rows();
$bool = $db->insert('people', array(
'name' => 'De Rudie',
'awesomeness' => true,
'favourite_pizza' => null,
));
$pk = $db->insert_id();
活动记录模型
你可以通过扩展 db_generic_model
来创建模型
class User extends db_generic_model {
static public $_table = 'users';
}
然后使所有程序更容易
$user = User::find(12); // User|null
$user = User::first(['username' => 'sander']); // User|null
$users = User::all(['country_id' => 12]); // User[]
所有对象都进行静态缓存,所以调用 find(X)
6 次,有 5 次是从缓存中获取的。
对活动对象执行活动
$user->update(['disabled' => true]);
$user->delete();
或者不使用对象
User::updateAll(['disabled' => true], ['username' => 'sander']);
User::deleteAll(['disabled' => true]);
使用 get_NAME()
添加动态属性。
class User extends db_generic_model {
function get_fullname() {
return "$this->firstname $this->lastname";
}
}
echo $user->fullname;
属性在对象中缓存,所以getter 只调用一次。
使用 relate_NAME()
添加关系
class User extends db_generic_model {
function relate_country() {
return $this->to_one(Country::class, 'country_id');
}
function relate_hobbies() {
return $this->to_many(Hobby::class, 'user_id');
}
function relate_groups() {
return $this->to_many_through(Group::class, 'users_groups', 'user_id', 'group_id');
}
function relate_num_groups() {
return $this->to_count(UserGroup::class, 'user_id');
}
function relate_group_ids() {
return $this->to_many_scalar('group_id', 'users_groups', 'user_id');
}
}
echo $user->country->name;
print_r($user->hobbies);
print_r($user->groups);
echo $user->num_groups;
print_r($user->group_ids);
所有主键必须是 id
。外键可以是任何内容。